[英]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.