2017-04-25 69 views
0

我嘗試查詢下面的MongoDB文檔結構;使用Java搜索MongoDB文檔子陣列

{ 
    "key": [{ 
     "1": [ 
     2, 
     3, 
     4 
     ] 
    }, 
    { 
     "2": [ 
     1 
     ] 
    } 
    ] 
} 

我要的是有自己的子場爲「1」的key領域內具有的所有文件。與之相關的數組是[2,3,4],它們是java Long值。我正試圖用下面的代碼來完成上面的邏輯,但沒有運氣;

BasicDBObject query = new BasicDBObject("key.1", null); 
MongoCursor<BasicDBObject> cursor = collection.find(query).iterator(); 
while (cursor.hasNext()) { 
    System.out.println(cursor.next()); 
} 

的原因,我在查詢對象空關聯key.1是因爲我不在乎數組中的值是什麼。

回答

0

你在這裏混合了幾件事情。

key.1與使用數字字符串名查詢子字段的點符號語法衝突。

這將與數組key的索引訪問衝突。

BasicDBObject query = new BasicDBObject("key.1", null);實際上是要求Mongo查詢key數組的索引值爲1的值null值。這將匹配,如果你有類似的東西

{ 
    "key": 
    [ 
     {"1":"one"}, 
     null 
    ] 
} 

好吧,現在回來後。如果你不關心價值,你必須使用$exist運算符。外殼過濾器將是{"key":{"$elemMatch":{"1":{ $exists: true}}}}。注意使用$elemMatch做字段級比較,因爲點符號與索引樣式訪問衝突。對於字符串名稱字段,點符號& elemMatch對於涉及單個查詢條件的查詢的嵌入式數組工作方式類似。有關運營商和語法

Java代碼

BasicDBObject exists = new BasicDBObject("$exists", true); 
BasicDBObject field = new BasicDBObject("1", exists); 
BasicDBObject elemMatch = new BasicDBObject("$elemMatch", field); 
BasicDBObject query = new BasicDBObject("key", elemMatch); 

更多信息。

https://docs.mongodb.com/manual/reference/operator/query/exists/

https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#op._S_elemMatch

https://docs.mongodb.com/manual/core/document/

+0

完美。非常感謝你的鏈接。 – StackUser