2015-10-21 42 views
0

我有一個集合如下

{ 
    "_id" : ObjectId("55bec0793bed809b2cb658ad"), 
    "lock_1" : ["desc_1","desc_2"], 
    "lock_2" : ["desc_1"] 
}, 
{ 
    "_id" : ObjectId("55bec0793bed809b2cb658ab"), 
    "lock_1" : ["desc_1","desc_2","desc_3"], 
    "lock_2" : ["desc_1"] 
} 
{ 
    "_id" : ObjectId("55bec0793bed809b2cb658ac"), 
    "lock_1" : ["desc_1"], 
    "lock_2" : [] 
}, 
{ 
    "_id" : ObjectId("55bec0793bed809b2cb658ae"), 
    "lock_1" : [], 
    "lock_2" : ["desc_1"] 
}, 
{ 
    "_id" : ObjectId("55bec0793bed809b2cb658aj"), 
    "lock_1" : ["desc_3","desc_4"], 
    "lock_2" : ["desc_5"] 
}, 
{ 
    "_id" : ObjectId("55bec0793bed809b2cb658ak"), 
    "lock_1" : [], 
    "lock_2" : [] 
} 

我以下面的查詢檢索所有具有兩個「lock_1」「desc_1」和「lock_2」陣列的文件,返回前兩個文件,這是正確的。

db.locks.find({ $and: [ {lock_1 : "desc_1"} , {lock_2 : "desc_1"} ] }) 

現在,我正在嘗試獲取不滿足上述條件的文檔。我試着使用下面的查詢,但它返回最後兩個文件。

db.locks.find({ $nor: [ {lock_1 : "desc_1"} , {lock_2 : "desc_1"} ] }) 

如何檢索其中「desc_1」不存在或存在於某個數組中的文檔?

回答

1

你所需要的就是在$or操作執行邏輯操作和$ne運營商直接測試字段的內容。

db.locks.find({ 
    "$or": [ 
     { "lock_1": { "$ne": "desc_1" } }, 
     { "lock_2": { "$ne": "desc_1" } } 
    ] 
}) 
+2

我覺得這比我的答案要好。更好地利用$ NE超過$寧在這種情況下。 – sergiuz

1
db.locks.find({ 
    $or: [ 
     { lock_1 : { $nin: [ "desc_1" ] }} , 
     { lock_2 : { $nin: [ "desc_1" ] }} 
    ] 
}) 

參考: $or $nin