2017-08-15 107 views
0

我使用的是mongodb版本3.4,帶有java驅動程序。檢查Mongodb 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" 
} 

我需要讓所有有 「型」 的文件: 「A」,用java。 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<>()); 

蒙戈殼牌查詢結果:

db.collection_name.aggregate([ 
    { 
    "$redact": { 
     "$cond": [ 
     { 
      "$let": { 
      "vars": { 
       "subelems": { 
       "$objectToArray": "$foo" 
       } 
      }, 
      "in": { 
       "$in": [ 
       "A", 
       "$$subelems.v.type" 
       ] 
      } 
      } 
     }, 
     "$$KEEP", 
     "$$PRUNE" 
     ] 
    } 
    } 
]) 
相關問題