【问题标题】:MongoDB updating wrong subdocument in an arrayMongoDB 更新数组中的错误子文档
【发布时间】:2015-03-30 21:14:12
【问题描述】:

我的游戏家族收藏看起来像这样

{
    "_id": ObjectId('54cc3ee7894ae60c1c9d6c74'),
    "game_ref_id": "REF123",
    ..
    "yearwise_details": [
    {
        "year": 1,
        ...
        "other_details": [
            {
                "type": "cash",
                "openingstock": 988
                ..
            },
            {
                "type": "FLU",
                "openingstock": 555
                ..
            },
            ..other items
        ]
    },
    {
        "year": 2,
        ...

        "other_details": [
            {
                "type": "cash",
                "openingstock": 3000,
                ....
            },
            ...
            {
                "type": "ghee",
                "openingstock": 3000,
                ...
            },
            ..
        ]
    }
]
}

我的更新查询

db.gamefamilies.update({"game_ref_id": "REF123", "teamname": "manisha","yearwise_details.year": 2, "yearwise_details.other_details.type": "ghee"}, {"$设置": {"yearwise_details.0.other_details.$.openingstock": 555} });

文档被正确拾取。我希望更新第 2 年的 item type="ghee" 但第 1 年的第 2 项(FLU 类型)会更新。我做错了什么?

任何帮助将不胜感激。

问候 玛尼莎

【问题讨论】:

  • 尝试制作 {yearwise_details.1.other_details.$.openingstock": 555}

标签: mongodb


【解决方案1】:

很遗憾,目前还不支持嵌套的$ positional operator 更新。

所以你可以用硬编码更新

db.gamefamilies.update({"game_ref_id": "REF123",
                        "teamname": "manisha",
                        "yearwise_details.year": 2,
                        "yearwise_details.other_details.type": "ghee"},
                       {"$set":
                         {"yearwise_details.1.other_details.$.openingstock": 555}});

但请注意,yearwise_details.1.other_details 是硬编码,您需要数组的第二个值(它是 0 索引的,因此 1 引用第二个元素)。我假设您在问题中找到了命令,因为它适用于数组的第一个元素。但它只会对第一个元素起作用,而上面的命令只会对第二个元素起作用。

【讨论】:

  • 感谢您的回复。如何获得 yearwise_details 的索引?另外我相信如果我将“yearwise_details”作为一个对象(而不是一个数组),那么这也可以解决我的问题。如果我把它变成一个对象,我可以添加新的 'yearwise_details' - 即轻松的新年子文档吗?
  • 获取您正在搜索的yearwise_details 的索引的唯一方法,您需要使用$,就像您对other_details 详细信息数组使用它一样。是否可以将other_details 数组从具有type 字段值为cashghee 的对象数组更改为以cash 作为其余cash 字段的对象对象和gheefield 对象其余部分的字段,而不是在子文档中指定类型?否则,您可以将 yearwise_details 从数组中转换为对象,但它会失去顺序。
  • 而且会有点困难。而不是pushing 对象,您将不得不$set 子文档字段与您将推送的对象的值。
  • 你说的是不是像下面这样: { "_id": ObjectId('54cc3ee7894ae60c1c9d6c74'), "game_ref_id": "REF123", .. "yearwise_details": [ { "year": 1 ,...现金:{“期初存货”:988 ..},酥油:{“期初存货”:555 ..},..},{“年”:2,...现金:{“期初存货”:3000 , .... }, ... 酥油:{ "openingstock": 3000, ... }, .. } ] }
  • 是的,这很有可能。使用这种结构,我将再次尝试所有查询。我观察到的是,我什至需要对 other_details 的索引进行硬编码,例如 yearwise_details.1.other_details.15
猜你喜欢
  • 2020-10-02
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2012-11-26
  • 1970-01-01
  • 2016-11-23
  • 2016-11-04
相关资源
最近更新 更多