MongoDB获取所有项目并标记收藏夹

时间:2013-03-12 23:48:42

标签: json mongodb

我想获取所有项目,并将我最​​喜欢的列表中的项目标记为收藏夹。

我有这个:

{
    "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中实现这一目标?

1 个答案:

答案 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”只会添加一次。