mongo聚合查询常见操作(match/project)
project中截取字符串mongo// 将map集合queryData中的主键corporateChampionIndustry的值,截取前4位"groupItemId": {"$substr": ["$queryData.corporateChampionIndustry",0,4]}JavaprojectionOperation = projectionOpera
·
match中正则匹配字符串
- mongo
// areaId满足12位数字
"areaId": {
"$regex": "^[0-9]{12}$"
}
- Java
criteria = criteria.and("areaId").regex("^[0-9]{12}$")
match中使用或条件
- mongo
"$match": {
"$or": [
{
"administrativeRegion": {
"$regex": "^500101",
"$options": ""
}
},
{
"administrativeRegion": {
"$regex": "^500102",
"$options": ""
}
}
]
}
- Java
criteria.orOperator(buildOrCriterias(queryParam.getRegions()));
private Criteria[] buildOrCriterias(String[] regions) {
List<Criteria> criterias = new ArrayList<>(regions.length);
for (String region : regions){
criterias.add(Criteria.where(Constants.REGION).regex(START_PREFIX + AreaUtils.areaIdStartWith(region)));
}
return criterias.toArray(new Criteria[0]);
}
project中截取字符串
- mongo
// 将map集合queryData中的主键corporateChampionIndustry的值,截取前4位
"groupItemId": {
"$substr": [
"$queryData.corporateChampionIndustry",
0,
4
]
}
- Java
projectionOperation = projectionOperation
.andExpression("substr('$queryData.corporateChampionIndustry',0,4)")
.as("groupItemId");
project中数据类型转换
- mongo
// 将rowIndicatorTexts.v的值转为double
"value": {
"$convert": {
"input": "$rowIndicatorTexts.v",
"to": "double",
"onError": 0,
"onNull": 0
}
}
- Java
projectionOperation = projectionOperation
.and(ConvertOperators.ToDouble.toDouble("$rowIndicatorTexts.v")).as("value"));
project取数组元数
- mongo
//去除数组中的第一个元素,命名为value
"value": {
"$arrayElemAt": [
"$projectData.v",
0
]
}
- java
ArrayOperators.ArrayElemAt
.arrayOf("$projectData.v").elementAt(0)
project字符串拆分
- mongo
// 将rowIndicatorTexts.v的值按逗号分隔
"slaveIndicatorIds": {
"$split": [
"$rowIndicatorTexts.v",
","
]
}
- java
projectionOperation = projectionOperation
.and(StringOperators.Split.valueOf("$rowIndicatorTexts.v").split(","))
.as("optionId")
project中使用switch case
- mongo
// respondentTaskStatus默认为0,当respondentTaskStatus为1和2时为1
"respondentTaskStatus": {
"$switch": {
"branches": [
{
"case": {
"$eq": [
"$respondentTaskStatus",
"1"
]
},
"then": "1"
},
{
"case": {
"$eq": [
"$respondentTaskStatus",
"2"
]
},
"then": "1"
}
],
"default": "0"
}
}
- Java
String[] respondentTaskStatus = new String[]{"1","2"};
int length = respondentTaskStatus.length;
ConditionalOperators.Switch.CaseOperator[] caseOperators =
new ConditionalOperators.Switch.CaseOperator[length];
for (int i = 0; i < length; i++) {
String respondentStatus = respondentTaskStatus[i];
caseOperators[i] =
ConditionalOperators.Switch.CaseOperator
.when(ComparisonOperators.valueOf("respondentTaskStatus")
.equalToValue(respondentStatus))
.then("1");
}
projectionOperation = projectionOperation
.and(ConditionalOperators.switchCases(caseOperators).defaultTo("0"))
.as("respondentTaskStatus");
group中的主键
不需要重命名
- mongo
{
"$group": {
"_id": {
"catalogItemId": "$catalogItemId",
"indicator": "$indicator"
},
"count": {
"$sum": "$value"
}
}
}
- java
Aggregation.group("catalogItemId","indicator").sum("value").as("count")
需要重命名
- mongo
{
"$group": {
"_id": {
"indicator": "$rowIndicatorTexts.k",
"slaveIndicatorId": "$rowIndicatorTexts.v"
},
"count": {
"$sum": 1
}
}
}
- java
List<Field> fields = new ArrayList<>();
fields.add(Fields.field("indicator","rowIndicatorTexts.k"));
fields.add(Fields.field("slaveIndicatorId","rowIndicatorTexts.v"));
Aggregation.group(Fields.from(fields.toArray(new Field[0])))
.count().as("count")
group不进行计算的字段
- mongo
{
"$group": {
"_id": "$_id",
"respondentId": {
"$last": '$respondentId'
}
}
}
- java
groupOperation = groupOperation
.last("respondentId").as("respondentId");
group合并多条数据的一个字段为数组
- mongo
{
"$group": {
"_id": "$_id",
"rowIndicatorTexts":
{"$push": '$rowIndicatorTexts' }
}
}
- java
groupOperation = groupOperation
.push("rowIndicatorTexts").as("rowIndicatorTexts")
更多推荐
已为社区贡献1条内容
所有评论(0)