您可以使用AggregationExpression
($map
运营商)& AggregationOperation
($redact
阶段)建立下面聚集3.4
。
$objectToArray
到description
转换成关键值对和$map
字符串值,并使用$in
,以检查是否test
是在值的数组,如果匹配$$KEEP
别的$$PRUNE
文档内$redact
阶段。
AggregationExpression mapExpression = aggregationOperationContext -> {
Map<String, Object> map = new LinkedHashMap<>();
map.put("input", new BasicDBObject("$objectToArray", "$description"));
map.put("as", "result");
map.put("in", "$$result.v");
return new BasicDBObject("$map", map);
};
AggregationOperation redactOperation = aggregationOperationContext -> {
Map<String, Object> map = new LinkedHashMap<>();
map.put("if", new BasicDBObject("$in", Arrays.asList("test", mapExpression.toDbObject(Aggregation.DEFAULT_CONTEXT))));
map.put("then", "$$KEEP");
map.put("else", "$$PRUNE");
return new BasicDBObject("$redact", new BasicDBObject("$cond", map));
};
Aggregation aggregation= Aggregation.newAggregation(redactOperation);
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(Aggregation.newAggregation(redactOperation),collection_name, BasicDBObject.class);
壳牌查询,供您参考:
db.collection_name.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$in": [
"test",
{
"$map": {
"input": {
"$objectToArray": "$description"
},
"as": "result",
"in": "$$result.v"
}
}
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])