在更新之前检查Mongoose数组中的嵌套对象键[value]

时间:2017-01-15 06:57:43

标签: node.js mongodb express mongoose

我正在尝试使用$addToSet使用mongoose在mongo中将新对象插入到数组中:

我有两个型号:

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);

我想使用mongoose将item添加到items数组中,但前提是该项不存在。

目前,使用$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

如果有更好的方法来构建模型以获得相同的结果,我很高兴考虑到这一点

1 个答案:

答案 0 :(得分:3)

尝试这种方式:

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运营商将确保项目中没有itemId newItem的商品。然后,如果成功,newItem运算符将添加$push{new: true}告诉mongo在提供的回调中传递更新的文档