Mongodb

有沒有辦法通過 addToSet 找出值是否存在?

  • May 5, 2016

如果值不存在,addToSet 將值添加到數組中。

如果該值已經存在,MongoDB 將不會返回任何表明它存在的資訊。

有沒有辦法找出值是否存在?(除了通過數組)

MongoDB 不會像運算符那樣返回欄位級更新的結果$addToSet;整個文件更新要麼成功,要麼失敗。

但是,假設您使用的是 MongoDB 2.6 或更高版本,您可以通過檢查WriteResultupdate/upsert 上的返回值來推斷更新是否為空操作。

下面的範例使用 MongoDB 3.2。

測試數據:

db.fruit.insert([
   { _id: 'a', tasty: ['apple', 'banana', 'pear']},
   { _id: 'b', tasty: ['kumquat', 'banana', 'mango']},
   { _id: 'c', tasty: ['plum'] }
])

值已添加到數組

將“mango”添加到文件中的美味數組中a

db.fruit.update(
   { _id: 'a' },
   { $addToSet: { 'tasty': 'mango' }}
)

WriteResult({
 "nMatched": 1,
 "nUpserted": 0,
 "nModified": 1
})

由於唯一可能的更新是對數組,nModified:1表示添加了“芒果”。

值已存在於數組中

將“mango”添加到文件中的美味數組中b

db.fruit.update(
   { _id: 'b' },
   { $addToSet: { 'tasty': 'mango' }}
)

WriteResult({
 "nMatched": 1,
 "nUpserted": 0,
 "nModified": 0
})

由於唯一可能的更新是對數組,nModified:0表明“芒果”已經存在。

更新更多欄位

如果合併多個欄位更新,您將不知道實際更新了哪個欄位。在這種情況下,您可以專門匹配尚未設置數組值的文件:

db.fruit.update(
   // query
    {
        _id: 'c',
        tasty: { $nin: ['mango'] }
    },

    // update
   {
       $set: { fruitBasket: true },        
       $addToSet: { 'tasty': 'mango' }
   }
)

WriteResult({
 "nMatched": 1,
 "nUpserted": 0,
 "nModified": 1
})

引用自:https://dba.stackexchange.com/questions/136488