【发布时间】:2017-10-22 13:22:50
【问题描述】:
如果我有一组对象,每个对象都有相同的描述,但数量不同。
{
{
"_id": "101",
"description": "DD from my employer1",
"amount": 1000.33
},
{
"_id": "102",
"description": "DD from my employer1",
"amount": 1000.34
},
{
"_id": "103",
"description": "DD from my employer1",
"amount": 1000.35
},
{
"_id": "104",
"description": "DD from employer1",
"amount": 5000.00
},
{
"_id": "105",
"description": "DD from my employer2",
"amount": 2000.33
},
{
"_id": "106",
"description": "DD from my employer2",
"amount": 2000.33
},
{
"_id": "107",
"description": "DD from my employer2",
"amount": 2000.33
}
}
下面,我可以使用描述对它们进行分组:
{
{
"$group": {
"_id": {
"description": "$description"
},
"count": {
"$sum": 1
},
"_id": {
"$addToSet": "$_id"
}
}
},
{
"$match": {
"count": {
"$gte": 3
}
}
}
}
有没有办法将组中的所有金额都包含在内(_ids:101、102和103加上105,106,107)即使它们有很小的差异,但不包括奖金金额,其中上面的示例是_id 104?
我不相信它可以在小组赛阶段完成,但有什么可以在稍后阶段完成,可以将 _ids 101、102 和 103 组合在一起并排除 _id 104。基本上,我希望 MongoDB忽略 101、102、103 中的微小差异并将它们组合在一起,因为它们是来自同一雇主的薪水。
我一直在使用 $stdDevPop,但无法得出一个可靠的公式。
我正在寻找仅包含 _id 的简单数组输出。
{ “结果”: [ "101", "102", "103", "105", "106", “107” ] }
【问题讨论】:
-
您可以通过对“数量”进行一些数学运算来进行分组,即四舍五入到 1000 和
$push匹配的_id值到一个数组。 但是,目前您的“金额”值是“字符串”。因此,您要么通过转换为数值来修复该数据,要么接受mapReduce的 JavaScript 评估。聚合框架运算符不能将字符串转换为数字。但是 JavaScript 可以。不过,您“应该”真正修复您的数据。 -
值是数字。错误地显示为字符串。
-
@NeilLunn 谢谢。我使用了 $trunc,然后按描述和截断的值分组,它正在做我想做的事情。
-
其实你刚刚写完答案。
标签: mongodb mongodb-query aggregation-framework