猫鼬:多:真的投影更新不起作用吗?

时间:2016-12-19 12:36:08

标签: mongodb mongoose

拥有具有以下结构的文档:

{
   _id: { type: mongoose.Schema.Types.ObjectId, ref: 'Story' },
   notifications: [{
      story: {
         _id: { type: mongoose.Schema.Types.ObjectId, ref: 'Story' },
         video_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Video' }
      },
      video: {
         _id: { type: mongoose.Schema.Types.ObjectId, ref: 'Video' },
         video_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Video' }
      },
      type: { type: String },
      read: { type: Number, default: 0 }, // 0 - Unread, 1 - read
      ts: { type: Date, default: Date.now }
    }]
}

我试图将read元素等于0的所有通知标记为已读,但出于任何原因,我的代码仅修改了第一个通知:

mongoose.model('User').update({ _id: user_id, 'notifications.read': 0 }, { $set: { 'notifications.$.read': 1 }}, { multi: true });

我是否正确使用multi: true

更新

我说我想做什么,使用placeholder没有任何意义,因为正如文档所说:

  

$。充当占位符以更新与更新中的查询条件匹配的第一个元素。

1 个答案:

答案 0 :(得分:0)

当您使用{ _id: user_id, 'notifications.read': 0 }来更新文档时,它只会找到一个文档,因为您正在_id查询。

您应该使用{'notifications.read': 0 }代替。