2017-04-24 53 views
0

集文檔:MongoDB中發現,所有的數組元素等於某個值

db.test.find() 
{ 
    { "_id" : ObjectId(...), "arr" : [ "Today", "is", null ] } 
    { "_id" : ObjectId(...), "arr" : [ null, null, null ] } 
} 

我試圖找到所有的arr等於某個值的所有文檔。在這個例子中,當我給出null時,我想要包含arr : [null, null, null]的文檔。

Find documents where ALL elements of an array have a specific value

該解決方案是接近我想要的東西;但是,我的陣列數據沒有$elemMatch的引用。有沒有辦法來完成這個查詢,而不會造成不必要的代價或重組我的數據?

謝謝!

+0

這裏還有一個非常類似的問題,在這裏也有非常類似的問題.http://stackoverflow.com/questions/23595023/check-if-every-element-in-array-matches-condition – Veeram

回答

0

您可以使用$elemMatch查詢運算符。它只需要一個查詢。

db.test.find({ arr: { $not: { $elemMatch: { $ne: null } } } }) 

"$elemMatch" + "$ne"

這部分包括了所有在那裏arr陣列沒有至少有一個空值的文件。

這些都是至少有一個非空值的文件。

$not

這部分將保持所有這些都沒有在"$elemMatch" + "$ne"的文件。

這些都是其所有的值爲null的所有文件。

請適應不存在字段的邊緣情況,以確保事情按預期工作。

+0

這似乎工作,增加了arr上的存在和大小檢查。謝謝! – Chris

0

您可以使用$all運算符,但語義可能不完全符合您的要求。

db.test.find({ arr: { $all: [null] } }) 

這將返回兩個測試文檔。

如果你真的想查詢與3個空值的數組,你可以查詢字面數組:

db.test.find({arr:[null,null,null]}) 
+0

正確,'$ all'運營商似乎如果任何值爲null(包括'arr'本身),則返回。不幸的是,數組中有多少個值是未知的,所以我將無法構造一個用於比較的文字數組。 – Chris

+0

這似乎是一個奇怪的要求。也許還有另一種解決方法。你能分享關於你的用例和例子的更多細節嗎? – helmy

+0

簡而言之,我需要能夠過濾數組中具有同類數據的文檔。例如,假設driver1和driver2在db.drivers中有以下條目:'{_id:「driver1」,record:[「win」,「win」,「win」]},{_id:「driver2」 [ 「贏」]}'。鑑於這些數據,我想要查詢db.drivers中是否有完美記錄的驅動程序,在這種情況下會返回這兩個驅動程序。 – Chris

相關問題