【发布时间】:2020-09-23 07:46:46
【问题描述】:
我正在尝试在管道阶段合并位于嵌入文档集合中的两个数组字段。但我不知道如何引用嵌入文档的两个“internal”数组。
集合
[{
name: "first",
docs: [
{ a1: ["a", "b"], a2: ["c"] },
{ a1: ["d", "e"], a2: ["f"] }
]
},
{
name: "second",
docs: [
{ a1: [1, 2], a2: [3] },
{ a1: [4, 5], a2: [6] }
]
}]
预期结果
[{
name: "first",
docs: [
{ merged: ["a", "b", "c"] },
{ merged: ["d", "e", "f"] }
]
},
{
name: "second",
docs: [
{ merged: [1, 2, 3] },
{ merged: [4, 5, 6] }
]
}]
方法
到目前为止,我尝试的总体方法是: (带有 2 个用于测试目的的硬编码数组)
db.getCollection("collection").aggregate([{
$set: {
"docs.merged": {
$concatArrays: [["hello"], ["world"]]
}
}
}])
产生预期结果:
[{
name : "first",
docs : [
{
a1 : ["a", "b"],
a2 : ["c"],
merged : ["hello", "world"] // <- OK
},
{
a1 : ["d", "e"],
a2 : ["f"],
merged : ["hello", "world"] // <- OK
}
]
},{
name : "second",
docs : [
{
a1 : [1.0, 2.0],
a2 : [3.0],
merged : ["hello", "world"] // <- OK
},
{
a1 : [4.0, 5.0],
a2 : [6.0],
merged : ["hello", "world"] // <- OK
}
]
}]
但我很难掌握如何引用 当前 嵌入文档中的字段:
// Using the "$" reference causes following error:
// Invalid $set :: caused by :: FieldPath field names may not start with '$'.
{
$set: {
"docs.merged": { $concatArrays: ["$docs.$.a1", "$docs.$.a2"] }
}
}
// $$this is only available with a MAP operator
{
$set: {
"docs.merged": { $concatArrays: ["$$this.a1", "$$this.a2"] }
}
}
注意事项
我不能使用update 查询,因为不得更改原始文档。所以这必须在aggregate 管道中实现。
此时我尽量避免使用unwind 操作,因为这会对性能产生重大影响。 actual 文档的根目录包含相当多的(可变)字段;在unwind 之后制作一个group 阶段相当复杂。
(为了便于阅读,该示例已大大简化)
我正在使用 MongoDB v4.4。
【问题讨论】:
标签: mongodb mongodb-query