【发布时间】:2020-07-07 14:37:04
【问题描述】:
在一个名为 test 的集合中,我有一些类似于以下内容的文档:
{
"_id" : "PRQA2311",
"name": "Binder",
"category": "Office Supplies",
"price": 3.99,
"...": "...",
"variants" : [
{
"barcode" : "2314399903212",
"attributes" : {
"color" : "red",
"size" : "Letter"
}
},
{
"barcode" : "2314399903213",
"attributes" : {
"color" : "red",
"size" : "A4"
}
},
{
"barcode" : "2314399903214",
"attributes" : {
"color" : "blue",
"size" : "Letter"
}
},
{
"barcode" : "2314399903215",
"attributes" : {
"color" : "blue",
"size" : "A4"
}
}
]
}
我使用以下聚合管道将它们拆分和重新组合,以便每个产品只有一种颜色:
db.test.aggregate([
{
$unwind: "$variants"
},
{
$group: {
_id: {
$concat: [
{ "$toString": "$_id" },
".",
{ "$toString": "$variants.attributes.color" }
]
},
name: { $first: "$name" },
variants: { $push: "$variants" }
}
}
]).pretty();
这很好用,但我也想复制其他字段。虽然我可以像使用name 字段一样将字段显式添加到组聚合中来做到这一点。如果我可以复制所有字段,它将使开发和维护更容易。
查看this question 的公认答案似乎在过去可能是不可能的。然而,第二个答案暗示,即使提供的解决方案不能立即适用于我的问题,也可能使用较新版本的 MongoDB。
我认为$mergeObjects 和$replaceRoot 可能有解决方案,但我还没有解决。
【问题讨论】:
-
data:{$push:$$ROOT}怎么样,而不是所有字段,即名称、变体。您将从之前的管道中获取所有字段吗? -
@Gibbs 我实际上一直在玩类似
"object": {"$first": "$$ROOT"}的东西,但是我仍然需要弄清楚如何对其进行转换,以便字段最终处于正确的位置。我在考虑 $addFields 或 $mergeObjects 后跟 replaceRoot。但我还没有多少运气。
标签: mongodb copy aggregation-framework grouping