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'
现在我想更新给定Document
和objectId
的writtenBack
属性。我将如何为此编写查询?
我的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:更新嵌套数组元素的主要内容,如果未能解决你的问题,请参考以下文章