[英]Check for sub field existence in Mongodb java driver
我正在使用带有Java驱动程序的mongodb 3.4版。
我有以下格式的json集合:
{
"foo": {
"d4231ds": {
"type":"A",
"color":"red"
},
"dmncxa3s": {
"type":"B",
"color":"yellow"
},
"JsdjS8": {
"type":"A",
"color":"red"
},
"SKJDcxar3": {
"type":"C",
"color":"green"
}
},
"bar": "100011"
}
我需要使用Java获取所有具有“ type”:“ A”的文档。 foo下的键(d4231ds,dmncxa3s等)是未知的,并且在文档之间有所不同。 因此,在这种情况下,不能使用点运算符。
我尝试了几种方法,但似乎无法实现。
您可以在最新的3.4服务器版本中尝试以下聚合。
使用$objectToArray
将已命名的键转换为键值对( k, v
),并使用$in
查询值文档的字段type = A
$redact
对查询过滤器的结果$$KEEP
进行匹配,否则匹配$$PRUNE
MongoClient mongoClient = new MongoClient();
MongoDatabase database = mongoClient.getDatabase(db_name);
MongoCollection<Document> mongoCollection = database.getCollection(collection_name);
Document query = Document.parse("{\"$redact\":{\"$cond\":[{\"$let\":{\"vars\":{\"subelems\":{\"$objectToArray\":\"$foo\"}},\"in\":{\"$in\":[\"A\",\"$$subelems.v.type\"]}}},\"$$KEEP\",\"$$PRUNE\"]}}");
List<Document> result = mongoCollection.aggregate(Arrays.asList(query)).into(new ArrayList<>());
Mongo Shell查询:
db.collection_name.aggregate([
{
"$redact": {
"$cond": [
{
"$let": {
"vars": {
"subelems": {
"$objectToArray": "$foo"
}
},
"in": {
"$in": [
"A",
"$$subelems.v.type"
]
}
}
},
"$$KEEP",
"$$PRUNE"
]
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.