我有一个集合,其中包含几百万个文档,其结构如下:
{
"_id" : "5c94bdbfcfccf91aa6903254",
"source" : "somesourceinfo/6410",
"language" : "de-de",
"date_created" : "2019-03-22T10:10:58",
"data" : [
{
"value" : "SALE",
"type" : "product.category"
},
{
"value" : "KOCHEN & BACKEN, Kochen, Bräter / Schmortöpfe",
"type" : "product.category"
},
{
"value" : "4009209314754",
"type" : "product.gtin"
},
{
"value" : "Fissler",
"type" : "product.manufacturer"
},
{
"value" : "55122631",
"type" : "product.manufacturer_number"
}
]
}
我需要将具有相同product.gtin的文档合并到一个文档中,其中data是一个数组,其中包含匹配文档的所有数据数组的元素。
我尝试过使用聚合框架,但是我似乎总是被卡在某个地方。我通常从匹配实际包含“ product.gtin”的文档开始。
然后,我尝试按该值(各个数组元素中的value属性)分组,并使用$ addToSet组合“数据” -Array,但是无法按该值分组或我只是找不到正确的表达方式。
我还尝试将数组转换为对象并将其放置到文档的根目录中,但是随后遇到了问题,因为我们的类型中包含点,因此我无法再访问属性。
我尝试了其他几种方法,但是通常我有时会遇到问题。
我在问自己,使用我们这样的数据结构是否真的可以实现这一目标。
我如何开始的示例:
db.bulk.aggregate(
[
{
$match: { "data.type" : { $eq : "product.gtin" }}
}
],
{ allowDiskUse : true }
)
下一阶段将是$ group,然后使用适当的数组元素的值,但是我似乎无法访问它。 我见过人们通过$ unwind访问数组中的子文档,但是看来,这样做之后,我不能以一种很好的方式(例如data.value)进行分组,而又不能按相同的其他值进行分组。>
答案 0 :(得分:1)
已编辑答案,因为旧版本包含错误:
db.bulk.aggregate(
[
{
$match: { "data.type": { $eq: "product.gtin" } }
},
{
$addFields: {
gtin: {
$reduce: {
input: "$data",
initialValue: "",
in: { $concat: ["$$value", { $cond: { if: { $eq: ["$$this.type", "product.gtin"] }, then: "$$this.value", else: "" } }] }
}
}
}
},
{
$project: {
data: {
$map: {
input: "$data",
as: "el",
in: { type: "$$el.value", value: "$$el.value", source: "$source" }
}
},
source: "$source",
gtin: "$gtin"
}
},
{ $group: { _id: "$gtin", data: { $addToSet: "$data" }, source: { $addToSet: "$source" } } },
{
$addFields: {
data: {
$reduce: {
input: "$data",
initialValue: [],
in: { $concatArrays: ["$$value", "$$this"] }
}
}
}
},
{ $out: "bulk.gtin" }
],
{ allowDiskUse: true }
)