2017-01-15 92 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