【问题标题】:mongoDB: update nested array elementmongoDB:更新嵌套数组元素
【发布时间】:2022-01-22 16:44:42
【问题描述】:

我有以下数据结构

{
_id: ObjectId('61ae12bfb8047effd0ac2a01'),
data: [
    {
        xml: {
            messageId: 1638798015073,
            xmlString: 'someXML'
        },
        data: [
            {
                customerId: 123456,
                validation: {
                    isValid: true,
                    message: ''
                },
                docs: [
                    {
                        objectId: 'PA1106:zt:bb302216879669b58c141b12dcdd5eb0',
                        writtenBack: false
                    }
                ]
            },
            {
                customerId: 55555,
                validation: {
                    isValid: true,
                    message: ''
                },
                docs: [
                    {
                        objectId: 'PA1106:zt:bb302216879669b58b143ef38c016217',
                        writtenBack: true
                    }
                ]
            }
        ]
    },
    {
        xml: {
            messageId: 1638798015094,
            xmlString: 'someXML'
        },
        data: [
            {
                customerId: 55555,
                validation: {
                    isValid: true,
                    message: ''
                },
                docs: [
                    {
                        objectId: 'PA1106:zt:bb302216879669b58c1416129062c2d2',
                        writtenBack: false
                    },
                    {
                        objectId: 'PA1106:zt:b8be9ea04011c2a18c148a0d4c9d6aab',
                        writtenBack: true
                    }
                ]
            },
        ]
    },
],
createdAt: '2021-12-06T13:40:15.096Z',
createdBy: 'Test'
}

现在我想更新给定DocumentobjectIdwrittenBack 属性。我将如何为此编写查询?

我的updateOne 看起来像这样

            {
                _id: '61ae12bfb8047effd0ac2a01',
                'data.data.docs.objectId': 'PA1106:zt:bb302216879669b58b143ef38c016217'
            },

            {
                $set: { 'data.data.docs.$.writtenBack': true }
            }

我知道嵌套数组有arrayFilters,但据我所知,我需要每个数组级别的唯一标识符。但我只有一个文档唯一的 objectId。有什么想法吗?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    是的,您可以使用positional operator $[]arrayFilters 实现对嵌套数组中文档的更新。

    db.collection.update({
      _id: "61ae12bfb8047effd0ac2a01",
      
    },
    {
      $set: {
        "data.$.data.docs.$[doc].writtenBack": true
      }
    },
    {
      arrayFilters: [
        {
          "doc.objectId": "PA1106:zt:bb302216879669b58b143ef38c016217"
        }
      ]
    })
    

    Sample Mongo Playground

    【讨论】:

    • 谢谢。但这似乎行不通。我收到错误 The positional operator did not find the match needed from the query 。有任何想法吗?另外,如果在第二个数据数组中没有位置运算符,它是如何工作的?
    • 您好,当您尝试使用$ 访问它时,我怀疑存在字段不是数组的文档。如果您能提供该场景的数据会更好。
    【解决方案2】:

    我让它与这个查询一起工作

                {
                    _id: '61ae12bfb8047effd0ac2a01',
                },
                {
                    $set: { 'data.$[elem1].data.$[elem2].docs.$[elem3].writtenBack': true }
    
                },
                {
                    arrayFilters: [
                        { 'elem1.xml.messageId': 1638798015094 },
                        { 'elem2.customerId': 55555},
                        { 'elem3.objectId': 'PA1106:zt:bb302216879669b58c1416129062c2d2'}]
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多