更新时的Mongo错误:无法使用零件遍历元素[重复]
Posted
技术标签:
【中文标题】更新时的Mongo错误:无法使用零件遍历元素[重复]【英文标题】:Mongo error when updating: cannot use the part to traverse the element [duplicate] 【发布时间】:2018-11-11 16:47:01 【问题描述】:我正在尝试使用以下结构更新我的 mongo 集合
"_id" : "T6GqWsi9qSxnyGzgC",
"spec_name" : "test",
"version" : "test",
"message_type" : "test",
"message_trigger" : "test",
"segments" : [
"segment_id" : "MSH",
"sequences" : [
"dataType" : "ST",
"optionality" : "R",
"name" : "Field Seperator"
,
"dataType" : "ST",
"optionality" : "R",
"name" : "Encoding Characters"
,
"dataType" : "HD",
"optionality" : "O",
"name" : "Sending Application"
,
"dataType" : "HD",
"optionality" : "O",
"name" : "Sending Facility"
,
"dataType" : "HD",
"optionality" : "O",
"name" : "Receiving Application"
,
"dataType" : "HD",
"optionality" : "O",
"name" : "Receiving Facility"
,
"dataType" : "TS",
"optionality" : "O",
"name" : "Data/Time Of Message"
,
"dataType" : "ST",
"optionality" : "O",
"name" : "Security"
,
"dataType" : "CM",
"optionality" : "R",
"name" : "Message Type"
,
"dataType" : "ST",
"optionality" : "R",
"name" : "Message Control ID"
,
"dataType" : "PT",
"optionality" : "R",
"name" : "Processing ID"
,
"dataType" : "NM",
"optionality" : "O",
"name" : "Sequence ID"
,
"dataType" : "ST",
"optionality" : "O",
"name" : "Continuation Pointer"
,
"dataType" : "ID",
"optionality" : "O",
"name" : "Accept Acknowledgment Type"
,
"dataType" : "ID",
"optionality" : "O",
"name" : "Application Acknowledgment Type"
,
"dataType" : "ID",
"optionality" : "O",
"name" : "Country Code"
,
"dataType" : "ID",
"optionality" : "O",
"name" : "Character Set"
,
"dataType" : "CE",
"optionality" : "O",
"name" : "Principal Language Of Message"
]
],
"segment_groups" : [
"grouping_id" : 692335,
"segments" : [
"segment_id" : "test",
"group_segment_id" : 597268,
"sequences" : [ ]
]
]
我希望将 value_one: "value", value_two: "value" 附加到 segment_groups 中的序列数组中。我的查询如下所示:
db.messages.update("segment_groups.segments.group_segment_id": 597268,$push: "segment_groups.segments.$.sequences":"value_one":"value", "value_two":"value")
当我尝试这个时,我得到了错误:
"code" : 16837,
"errmsg" : "cannot use the part (segment_groups of segment_groups.segments.0.sequences) to traverse the element (segment_groups: [ grouping_id: 692335, segments: [ segment_id: \"test\", group_segment_id: 597268, sequences: [] ] ])"
enter code here
我已经在这个问题上待了一天,没有遇到任何关于如何解决或如何重组我的收藏的合理建议。我是 mongo 的新手,不了解构建时的最佳实践,因此任何需要使其成为更好解决方案的方法都很有价值。
【问题讨论】:
哪个 Mongo 版本? 版本是3.4.10 你能升级到 3.6 吗? 【参考方案1】:您遇到的问题是您的模型有两层嵌套数组(segments_groups
和 segments
),Mongo 无法确定该数组中的哪些项目需要更新。
在 MongoDB 3.6 中,使用 arrayFilters / positional filtered operator 很容易解决这个问题。在您的更新路径中,您为每个数组指定代表一个特定项目的占位符,然后您必须将匹配条件添加为 arrayFilters
以帮助 MongoDB 找到您要更新的项目。在你的情况下:
db.messages.update("_id" : "T6GqWsi9qSxnyGzgC",
$push: "segment_groups.$[sg].segments.$[s].sequences": "value_one":"value", "value_two":"value" ,
arrayFilters: [ "sg.grouping_id": 692335 , "s.group_segment_id": 597268 ] )
所以$[sg]
是一个特定的segment_group
而$[s]
代表一个段。
【讨论】:
以上是关于更新时的Mongo错误:无法使用零件遍历元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章