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

Vin*_*mes 1 mongoose mongodb node.js express

我正在尝试使用$addToSetmongoose 将新对象插入到 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);
Run Code Online (Sandbox Code Playgroud)

我想使用 mongoose 将一个添加itemitems数组中,但前提是该项目不存在。

目前, using$addToSet仍在添加重复项,因为我认为每个项目的 save_date 戳都不同

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

这会导致用户输入:

"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")
        }
    ]
Run Code Online (Sandbox Code Playgroud)

是否可以itemId在添加条目之前检查是否存在,以避免"itemId": 123出现如上所示的两个?

如果有更好的方法来构建模型以实现相同的结果,我也很乐意考虑

Kar*_*len 7

试试这个方法:

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);
   }
);
Run Code Online (Sandbox Code Playgroud)

$nin操作员将确保项目中没有与 相同itemId的项目newItem。然后,如果成功,newItem将由$push运营商添加。{new: true}告诉 mongo 在提供的回调中传递更新的文档