2014-02-20 54 views
0

我有以下文件:

{ 
    _id: 1 
    title: "oneItem" 
}, 
{ 
    _id: 2, 
    title: "twoItem" 
} 

當我試圖找到這些文件使用以下命令:

db.collection.documents.find({_id: {$in: [1, 2]}}); 

我得到了這兩個文件,但是當我試圖找到這些文件通過以下查詢:

db.collection.documents.find({_id: {$all: [1, 2]}}); 

我什麼也沒得到。你能解釋有什麼問題嗎?基本上我需要找到_id 1和2的所有文檔,如果不存在則失敗。

回答

2

推理其實很簡單,因爲$in$all有兩個完全不同的功能。該文件的鏈接存在,但解釋:

考慮這些文件:

{ 
    _id: 1, 
    items: [ "a", "b" ] 
}, 
{ 
    _id: 2, 
    items: [ "a", "b", "c" ] 
} 

$在 - 提供了可能匹配在現場被測試的值參數的列表。這將匹配如下:

db.collection.find({ items: {$in: [ "a", "b", "c" ] }}) 

{ 
    _id: 1, 
    items: [ "a", "b" ] 
}, 
{ 
    _id: 2, 
    items: [ "a", "b", "c" ] 
} 

$所有 - 提供其中被匹配字段被預期是一個數組和所列出的元件的所有存在該數組中的列表。 E.g

db.collection.find({ items: {$all: [ "a", "b", "c" ] }}) 

{ 
    _id: 2, 
    items: [ "a", "b", "c" ] 
} 

因此,爲什麼您的查詢不返回結果,本場是不是數組,不包含元素。

MongoDB operator reference是你應該真正通讀。

正如你對你的說法,[「我需要找到所有文檔與_id 1和2,如果從他們那裏有人不存在,那麼失敗。」],匹配不同的標準是容易爲你的使用看$ in。你的問題是你想要一個整套匹配或以其他方式返回(「失敗」)。這我已經在previous question給你解釋的一些長度,但再次重申:

db.collection.aggregate([ 
    // Match on what you want to find 
    {$match: { list: {$in: [1,2]} }}, 

    // Add the found results to a distinct *set* 
    {$group: { _id: null, list: {$addToSet: "$_id"} }}, 

    // Only return when *all* the expected items are in the *set* 
    {$match: { list: {$all: [1,2]} }} 
]) 

這樣操作之後,這樣只會返回一個結果的項目,如果所有地方發現的。這就是我們如何使用$全部以這種方式匹配。

+0

感謝您的迴應,但我怎麼能得到所有文件與_id 1和2或失敗,如果其中一個不存在? – Erik

+0

@Erik我擴大了用法。這應該更好地解釋。我也在你之前的問題中解釋了你的評論(不是你的問題)http://stackoverflow.com/a/21881817/2313887 –

+0

@Erik最終編輯來清除這個問題。 –

相關問題