【发布时间】:2018-08-13 22:44:55
【问题描述】:
假设我有一个小数据集:
[
{"A": 0, "B": 0, "X": 100, "Y": 100},
{"A": 1, "B": 0, "X": 50, "Y": 55},
{"A": 0, "B": 1, "X": 25, "Y": 30},
{"A": 1, "B": 1, "X": 1, "Y": 6}
]
我还有一个管道,其中最后阶段是一个组:
[
{
"$group": {
"_id": {
"classification1": {
"$eq": ["$A", 1]
},
"classification2": {
"$eq": ["$B", 1]
}
},
"countX": {"$sum": "$X"},
"countY": {"$sum": "$Y"}
}
}
]
这个管道的输出:
[
{"_id": {"classification1": false, "classification2": false}, "countX": 100, "countY": 100},
{"_id": {"classification1": true, "classification2": false}, "countX": 50, "countY": 55},
{"_id": {"classification1": false, "classification2": true}, "countX": 25, "countY": 30},
{"_id": {"classification1": true, "classification2": true}, "countX": 1, "countY": 6}
]
我需要哪些管道步骤才能达到这样的融合格式?
[
{"name": "classification1", "countX": 51, "countY": 61},
{"name": "classification2", "countX": 26, "countY": 36}
]
请注意,此转换将前一阶段的文档 1 计数为零次,并将文档 4 计数两次(因为两个条件都为假,或两者都为真)。
我为此编写了一个 Javascript 函数,但是无法从管道调用 Javascript 函数(聚合管道必须是可序列化的)。不幸的是,这意味着我必须从数据库中卸载数据,在数据上运行脚本,然后将转换后的数据作为临时集合重新加载,以在此阶段之后完成管道的其余部分。
非常感谢任何帮助。
【问题讨论】:
标签: mongodb aggregation-framework