【问题标题】:mongodb: update array item inside of a post inside of a collectionmongodb:更新集合内帖子内的数组项
【发布时间】:2014-01-25 15:57:02
【问题描述】:

我试图弄清楚如何更新作为帖子一部分的数组中的项目。 我确实找到了这个看起来最接近我正在寻找的东西:MongoDB Update Array element

但我没有像这个例子似乎显示的那样首先排列特定的帖子。但是我需要先使用 _id 找到特定的帖子,然后从结果帖子中更新数组中的一个项目。

我可以使用一个查询来执行此操作,还是需要先找到该项目然后像另一个答案中显示的示例那样更新它?

在下面的 json 中,我如何更新第一个帖子 cmets: first comment?

编辑:

[{
    "_id": "52c06c86b78a091f26000001",
    "comments": [
        {
            "user_id": "52ad97bab142627664000001 ",
            "username": "phacer",
            "comment": "nice dress!!!",
            "created": 1390668491909,
            "_id": "_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk="
        },
        {
            "user_id": "52ad97bab142627664000001 ",
            "username": "phacer",
            "comment": "nice dress!!!",
            "created": 1390668491909,
            "_id": "_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk="
        }
    ],
    "desc": "Something somethingson",
    "hate": [],
    "imageurl": "some url",
    "love": [
        {
            "user_id": "52add4f4344e8ca867000001",
            "username": "asd",
            "created": 1390652212592
        }
    ],
    "tags": [
        {
            "y": 29.3,
            "brand": "Zara",
            "type": "Bow Tie",
            "x": 20,
            "color": "Black"
        }
    ],
    "user_id": "52add4f4344e8ca867000001"
},
{
    "_id": "52c06c86b78a091f26000001",
    "comments": [
        {
            "user_id": "52ad97bab142627664000001 ",
            "username": "phacer",
            "comment": "nice dress!!!",
            "created": 1390668491909,
            "_id": "_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk="
        }
    ],
    "desc": "Something somethingson",
    "hate": [],
    "imageurl": "some url",
    "love": [
        {
            "user_id": "52add4f4344e8ca867000001",
            "username": "asd",
            "created": 1390652212592
        }
    ],
    "tags": [
        {
            "y": 29.3,
            "brand": "Zara",
            "type": "Bow Tie",
            "x": 20,
            "color": "Black"
        }
    ],
    "user_id": "52add4f4344e8ca867000001"
}]

【问题讨论】:

  • 您应该能够在一次操作中根据查询更新数组。您为什么不发布一些示例 json 并解释您希望更新做什么,我们也许可以为您发布一个示例。
  • @cirrus 我已经添加了一些 json,谢谢。
  • +1 for $elemMatch - 但如果我有选择的话,我很想将这些 cmets 放入他们自己的集合中。这样我就可以在 user_id、_id 和 post_id 上使用索引。轻松快速地添加和更新。删除一个帖子和所有 cmets 会涉及更多,但我怀疑这是一个不太常见的操作。

标签: node.js mongodb


【解决方案1】:

您应该考虑像这样使用$elemMatch (Documentation):

.update({'_id': '52c06c86b78a091f26000001', 'comments' : {$elemMatch: {'_id': '_SvF-Ag4d6wFf9QR1KdAdFIpcCyI3cqm2F4rl3w7rdk='}}}, {$set : {'comments.$.comment': 'Lame dress!'}})

【讨论】:

    【解决方案2】:

    您可以在 Mongo 中使用位置运算符来访问特定的数组元素,如下所示

    db.collection.update( { _id: 52c06c86b78a091f26000001 }, { $set: { "comments.$1.comment" : "dress" } } ) 
    

    【讨论】:

    • 谢谢,这看起来很棒。如果我不知道我要更新哪些 cmets 怎么办。例如,如果我能通过 _id 找到它?
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多