检查Mongodb java驱动程序中是否存在子字段
我使用的是mongodb 3.4版,带有java驱动程序 我有一个这种格式的JSON集合:检查Mongodb java驱动程序中是否存在子字段,java,mongodb,Java,Mongodb,我使用的是mongodb 3.4版,带有java驱动程序 我有一个这种格式的JSON集合: { "foo": { "d4231ds": { "type":"A", "color":"red" }, "dmncxa3s": { "type":"B", "color":"yellow" }, "JsdjS8": { "type":"A", "color":
{
"foo": {
"d4231ds": {
"type":"A",
"color":"red"
},
"dmncxa3s": {
"type":"B",
"color":"yellow"
},
"JsdjS8": {
"type":"A",
"color":"red"
},
"SKJDcxar3": {
"type":"C",
"color":"green"
}
},
"bar": "100011"
}
我需要使用java获取所有类型为A的文档。foo d4231ds、dmncxa3s等项下的密钥事先不知道,并且文档之间存在差异。因此,在这种情况下,使用点运算符不起作用
我试过几种方法,但似乎都能做到这一点 您可以在最新的3.4服务器版本中尝试以下聚合 使用$objectToArray将命名键转换为键值对k、v,并使用$in查询字段类型=A的值文档 $redact作用于查询筛选器的结果,$$KEEP when match else$$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<>());
db.collection_name.aggregate([
{
"$redact": {
"$cond": [
{
"$let": {
"vars": {
"subelems": {
"$objectToArray": "$foo"
}
},
"in": {
"$in": [
"A",
"$$subelems.v.type"
]
}
}
},
"$$KEEP",
"$$PRUNE"
]
}
}
])