2017-01-15 88 views
0

我想使用$addToSet用貓鼬將新對象到蒙戈陣列:檢查嵌套對象鍵[值]在貓鼬陣列,更新前

我有兩個型號:

var itemSchema = mongoose.Schema({ 
    itemId: Number, 
    save_date: {type: Date, default: Date.now} 
}); 

var UserSchema = new Schema({ 
    ... 
    items: [itemSchema] 
}); 

var User = mongoose.model('User', UserSchema); 

我想用貓鼬在items數組中添加一個item,但前提是該項不存在。

目前,使用$addToSet仍在增加重複,因爲,我認爲的save_date郵票是爲每個項目不同:

User.findByIdAndUpdate(
     id, 
     {$addToSet: {item: {itemId: newItem} } }, 
     {upsert: true}, 
     function (err, saveItem){ 
     if (err) {return handleError(err)}; 
     res.send(saveItem); 
     } 
); 

這會導致用戶條目:

"name": "Vinnie James" 
"items" : [ 
     { 
      "itemId" : 123, 
      "_id" : ObjectId("587b10259233c524454d745d"), 
      "save_date" : ISODate("2017-01-15T06:01:09.850Z") 
     }, 
     { 
      "itemId" : 123, 
      "_id" : ObjectId("587b17398ed7052b1e5196bc"), 
      "save_date" : ISODate("2017-01-15T06:31:21.263Z") 
     } 
    ] 

是它可能在添加條目之前檢查itemId是否存在,以避免如上所示有兩個"itemId": 123

如果有更好的方式來構建模型來達到同樣的結果,我很高興地考慮以及

+0

我想我可以先運行一個數據庫查詢的項目,只做更新,如果'itemId'不存在,但是這感覺有點圓a - 關於 –

回答

2

試試這個方法:

User.findOneAndUpdate(
    {_id: id, "items.itemId": {$nin:[newItem.itemId]}}, 
    {$push: {items: newItem }}, 
    {new: true} 
    function (err, updatedUser){ 
     if (err) {return handleError(err)}; 
     res.send(updatedUser); 
    } 
); 

$nin運營商將確保有不是與newItem相同的itemId的商品。那麼如果它成功,newItem將被$push運營商添加。 {new: true}告訴mongo通過提供的回調中的更新文檔

+0

是的,正是我所期待的。謝謝! –

+0

不客氣:) – Karlen