我正在使用mongodb 3.4版,带有java驱动程序。
我有这种格式的jsons集合:
{
"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等)事先不知道,文档之间也不同。因此,在这种情况下使用点运算符不起作用。
我已经尝试了几种方法,但似乎没有达到这个目的。
答案 0 :(得分:1)
您可以在最新的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"
]
}
}
])