【问题标题】:Meteor: Update nested object in document arrayMeteor:更新文档数组中的嵌套对象
【发布时间】:2016-04-14 11:27:05
【问题描述】:

我尝试更新文档中的特定对象。在本例中,我想用group.id = 'fdsfsFDSFdsfFdsFd'data.id = 'qqdWSdksFVfSVSSCD' 更改对象。

这意味着我想用var newData = { "id" : "qqdWSdksFVfSVSSCD", "new one" : "anything" } 更新对象{ "id" : "qqdWSdksFVfSVSSCD", "note 2" : "text" }

{
    "_id" : "wLXDvjDvbsxzfxabR",
    "group" : [
        {
            "id" : "dfDFSfdsFDSfdsFws",
            "title" : "title 1",
            "data" : [
                {
                    "id" : "efBDEWVvfdvsvsdvs",
                    "note" : "text"
                }
            ]
        },
        {
            "id" : "fdsfsFDSFdsfFdsFd",
            "title" : "title 2",
            "data" : [
                {
                    "id" : "WVvfsvVFSDWVDSVsv",
                    "note 1" : "text"
                },
                {
                    "id" : "qqdWSdksFVfSVSSCD",
                    "note 2" : "text"
                },
                {
                    "id" : "MZgsdgtscdvdsRsds",
                    "note 3" : "text"
                }
            ]
        }
    ]
}

那么我该如何访问这个对象呢?

Collection.update(
    { _id: 'wLXDvjDvbsxzfxabR' },
    { $set: { group.data: newData } } // group: fdsfsFDSFdsfFdsFd, data: qqdWSdksFVfSVSSCD
)

我无法更新嵌套数组元素...

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    如果要更新数组中的特定元素,则必须将其包含在查询中。此外,在嵌套对象中查询时,您应该将查询用引号括起来。

    // Update element in array with id "dfDFSfdsFDSfdsFws"
    Collection.update(
        { _id: "wLXDvjDvbsxzfxabR", "group.id": "dfDFSfdsFDSfdsFws"}, 
        {$set: { "group.data": newData }}
    );
    

    【讨论】:

    • 但我需要两个级别。那么,我如何准确访问我描述的对象。不应更改文档中的其他元素。
    • 对不起,我误解了这个问题。见迈克尔弗洛伊德的回答。即只需将查询{ _id: "wLXDvjDvbsxzfxabR", "group.id": "dfDFSfdsFDSfdsFws"}改为{ _id: "wLXDvjDvbsxzfxabR", "group.data.id": "qqdWSdksFVfSVSSCD"}即可。
    【解决方案2】:

    大卫的回答很接近:

    Collection.update(
      { _id: "wLXDvjDvbsxzfxabR", "group.data.id": "qqdWSdksFVfSVSSCD"}, 
      {$set: { "group.data": newData }}
    );
    

    【讨论】:

    • 我得到了架构不允许的“group.data”?
    • 这意味着您使用模式管理器(例如:simpl-schema) - 检查您的模式定义。架构是否允许 Collection 中的 group 对象,group 对象是否包含 data 数组?
    • 我使用 aldeed:simpleschema,并且我的架构中有一个数组,其中包含对象。架构(根据此示例)group: { type: [Object] }, group.$.data: { type: Object }。但是我在两者之间使用了$。它有效..
    【解决方案3】:

    herehere 所述,现在无法更新数组中的嵌套数组。

    如果可以,我建议您更改文档架构以删除数组中的嵌入数组。您可以将一个数组更改为 JSON 对象:

    {
    "_id" : "wLXDvjDvbsxzfxabR",
    "group" : [
        {
            "id" : "dfDFSfdsFDSfdsFws",
            "title" : "title 1",
            "data" : {
                 "efBDEWVvfdvsvsdvs": {
                    "note" : "text"
                 } 
            }
        },
        {
            "id" : "fdsfsFDSFdsfFdsFd",
            "title" : "title 2",
            "data" : {
                "WVvfsvVFSDWVDSVsv": {
                    "note 1" : "text"  
                },
                "qqdWSdksFVfSVSSCD": {
                    "note 2" : "text"
                },
                "MZgsdgtscdvdsRsds": {
                    "note 3" : "text"
                }
            }
        }
    ]
    }
    

    使用这样的模式,您可以使用这样的查询更新数据字段中的特定对象:

    db.collection.update(
      {'group.id': 'fdsfsFDSFdsfFdsFd'}, 
      {$set: {'group.$.data.qqdWSdksFVfSVSSCD': {"new one" : "anything"}}}
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2015-03-13
      • 2020-03-01
      相关资源
      最近更新 更多