mongodb / mongoose addToSet将对象添加到具有相同ID的数组

时间:2018-07-22 16:40:03

标签: node.js mongodb mongoose

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

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

这是我的活动模型:

@NgModule({
  imports: [
    CommonModule,
    MediaRoutingModule,
    MaterialModule
  ],
  declarations: [LayoutComponent, MediaComponent],
  exports: [
    MediaComponent
  ]
})
export class MediaModule {
}

export {MediaComponent};

这是我的addLike函数:

  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'
          }
        }
      ]
    }
  ]
}

当我添加likes时,我的likes数组如下所示:

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

2 个答案:

答案 0 :(得分: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' }]

答案 1 :(得分:0)

另一种选择是更改架构定义以添加“ _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'
          }
        }
      ]
    }
  ]