mongoDB:更新嵌套数组元素

Posted

技术标签:

【中文标题】mongoDB:更新嵌套数组元素【英文标题】:mongoDB: update nested array element 【发布时间】: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。有什么想法吗?

【问题讨论】:

【参考方案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']
            

【讨论】:

以上是关于mongoDB:更新嵌套数组元素的主要内容,如果未能解决你的问题,请参考以下文章

更新 mongodb 中的嵌套数组

更新数组mongodb内的嵌套数组[重复]

使用 MongoDB 更新嵌套数组

使用 MongoDB 更新嵌套数组

从嵌套数组mongodb中删除元素

从嵌套数组mongodb中删除元素