【问题标题】:mongodb/mongoose addToSet adds object to array with the same idmongodb/mongoose addToSet 将对象添加到具有相同 id 的数组
【发布时间】:2020-10-28 01:05:52
【问题描述】:

所以我遇到的问题是我只想喜欢用户评论一次,目前我正在使用 addToSet 运算符,因为根据定义,如果该值已经存在,它不会增加值。

但在我的情况下它会添加,可能是因为我添加的是对象而不是值,并且当我添加 mongo 时会生成 _id?

这是我的事件模型:

  creator: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  comments: [
    {
      user: {
        type: Schema.Types.ObjectId,
        ref: 'User'
      },
      text: {
        type: String,
        required: true
      },
      likes: [
        {
          user: {
            type: Schema.Types.ObjectId,
            ref: 'User'
          }
        }
      ]
    }
  ]
}

这是我的 addLike 函数:

commentLike: async (req, res) => {
    console.log('working', req.params.id, req.params.idas, req.params.commentID);
    Events.findOneAndUpdate(
      { _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
      { $addToSet: { 'comments.$.likes': { user: req.params.id } } },
      (result) => {
        res.json(result);
      }
    );
  }

当我添加喜欢时,我的喜欢数组看起来像这样:

        "likes" : [
            {
                "user" : ObjectId("5b53442c1f09f525441dac31"), 
                "_id" : ObjectId("5b54a5263e65324504035eac")
            }, 
            {
                "user" : ObjectId("5b4b4725a3a5583ba8f8d513"), 
                "_id" : ObjectId("5b54a5bb3e65324504035eb0")
            },
          ]

【问题讨论】:

  • 它不起作用,因为$addToSet 将整个对象放在一个上下文中,而在这里你只添加了user...所以这里你的一个元素是{ "user" : ObjectId("5b53442c1f09f525441dac31"), "_id" : ObjectId("5b54a5263e65324504035eac") } 现在它会添加如果user 相同但_id 不同,但如果user_id 相同,则不会添加..
  • 我明白了,有没有其他方法可以让用户添加到数组中,即使 _id 会有所不同?
  • 最好将likes 设为用户 ObjectIds 数组而不是对象。这将减少文档大小并允许 $addToSet 按您的意愿工作。

标签: node.js mongodb mongoose


【解决方案1】:

你可以关注这个

db.collection.update(
  { "_id": req.params.idas, "comments": { "$elemMatch": { "_id": req.params.commentID, "likes.user": { "$ne": req.params.id } } } }, 
  { "$push": { "comments.$.likes": { "user": req.params.id } } }
})

如果你刚开始你的项目,那么你应该遵循 JohnnyHK 的意见,让你的数组像这样使$addToSet 可行

likes: [{ type: Schema.Types.ObjectId, ref: 'User' }]

【讨论】:

    【解决方案2】:

    另一种选择是更改架构定义以添加“_id: false”以防止为数组中的子文档生成 _id 字段。

    在这种情况下,$addToSet 将按您的预期工作,即使是嵌套子文档,只要您的文档完全匹配。

    comments: [
        {
          user: {
            type: Schema.Types.ObjectId,
            ref: 'User'
          },
          text: {
            type: String,
            required: true
          },
          likes: [
            {
              _id: false, //add this
              user: {
                type: Schema.Types.ObjectId,
                ref: 'User'
              }
            }
          ]
        }
      ]

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2015-03-08
      • 2015-11-07
      • 2019-03-28
      • 2019-01-27
      • 2019-02-17
      • 1970-01-01
      相关资源
      最近更新 更多