更新时的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_groupssegments),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错误:无法使用零件遍历元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到 Mongo 数据库 [重复]

使用php时的mongodb错误[重复]

文档子数组存储为 Mongo 中第一个条目的重复值

插入时的 MongoDb 复制错误

如何使用节点 js 更新 mongo 文档中的数组元素?

foreach 总是重复第一个元素