给定一个具有收藏夹数组的用户,其中每个条目都是项目 id - 例如: { _id: 112233 "user": { "favorites": [2,7,13] } }
你会得到收藏夹数组 [2,7,13]
然后将更新写入您的项目集合(假设您的用户 ID 为 112233)
>db.items.update({"_id": {$in:[2,7,13]}}, {$set:{"isFavorite":true}},{ multi: true })
// yeilding
> db.items.find()
{ "_id" : 1, "value" : "myVal" }
{ "_id" : 3, "value" : "myVal" }
{ "_id" : 4, "value" : "myVal" }
{ "_id" : 2, "isFavorite" : true, "value" : "myVal" }
在您的示例中,您的项目有些嵌套 - 不确定这是否是真的。
如果您的项目记录是
{ _id:999,item:{_id:1,value:"myValue"}}
你真的打算更新“item._id”为1的项目(而不是文档强制_id 999),那么你会
db.items.update({"item._id": {$in:[2,7,13]}}, {$set:{"item.isFavorite":true}},{ multi: true })
正如@WiredPrairie 所指出的,它是一种特殊的文档结构。人们可能期望用户将他们的 _id 作为第一类字段——每条记录都有一个。
假设您的项目集合包含所有人共享的项目,您可能不想在项目上存储“isFavorite”,因为它不是每个人都喜欢的。另一种建模方法是向每个项目添加一个数组,其中包含喜欢他们的用户的 id。
就像是
>db.items.update({"_id": {$in:[2,7,13]}},{$addToSet:{"favoredByUserIds": "user1"}},{ multi: true })
// yeilding 'user1' in the favored by array
> db.items.find()
{ "_id" : 1, "value" : "myVal" }
{ "_id" : 3, "value" : "myVal" }
{ "_id" : 4, "value" : "myVal" }
{ "_id" : 2, "favoredByUserIds" : [ "user1" ], "value" : "myVal" }
使用 $addToSet 可以确保操作可以重复,但“user1”只会添加一次。