0

我想获取所有项目并将我的收藏夹列表中的那些标记为收藏夹。

假设我有这个:

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

4

1 回答 1

0

给定一个具有收藏夹数组的用户,其中每个条目都是项目 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”只会添加一次。

于 2013-03-13T01:40:41.273 回答