【问题标题】:Check nested object key[value] in Mongoose array, before an update在更新之前检查 Mongoose 数组中的嵌套对象键 [值]
【发布时间】:2017-01-15 16:59:05
【问题描述】:

我正在尝试使用 $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

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

【问题讨论】:

  • 我想我可以先对项目运行一个数据库查询,并且只在 itemId 不存在时才进行更新,但这感觉有点绕

标签: node.js mongodb express mongoose


【解决方案1】:

试试这个方法:

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

【讨论】:

  • 是的,正是我想要的。谢谢!
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2023-01-18
  • 1970-01-01
  • 2021-01-04
相关资源
最近更新 更多