col*_*els 6 database json mongodb nosql meteor
我正在尝试使用以下结构更新我的 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" : [ ]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我希望将 { 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"}}})
Run Code Online (Sandbox Code Playgroud)
尝试此操作时出现错误:
"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
Run Code Online (Sandbox Code Playgroud)
我已经在这个问题上呆了一天,没有遇到任何关于如何解决或如何重组我的收藏的合理建议。我是 mongo 的新手,并且在构建时不了解最佳实践,因此任何使其成为更好解决方案所需的方法都是有价值的。
您遇到的问题是您的模型有两层嵌套数组(segments_groups和segments ),而 Mongo 无法确定该数组中的哪些项目需要更新。
在 MongoDB 3.6 中,使用arrayFilters / 位置过滤运算符很容易解决这个问题。在您的更新路径中,您为每个数组指定代表一个特定项目的占位符,然后您必须添加匹配条件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 } ] })
Run Code Online (Sandbox Code Playgroud)
所以$[sg]是一个特殊的segment_group,$[s]代表一个细分市场。
| 归档时间: |
|
| 查看次数: |
6397 次 |
| 最近记录: |