我想获取所有项目,并将我最喜欢的列表中的项目标记为收藏夹。
我有这个:
{
"user": {
"favorites": [2]
}
}
和此:
{
"item": {
"_id"= "1",
"value": "myval"
}
}
{
"item": {
"_id"= "2",
"value": "myval"
}
}
... // Rest of documents
我想得到这个
{
"item": {
"_id"= "1",
"value": "myval"
}
}
{
"item": {
"_id"= "2",
"value": "myval",
"isFavorite": "yes" // I just want to mark my favorites somehow.
}
}
... // Rest of documents
我如何在MongoDB中实现这一目标?
答案 0 :(得分:0)
给定一个收藏夹数组的用户,其中每个条目都是项目ID - 例如: { _id:112233 “user”:{ “最爱”:[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”只会添加一次。