在MongoDB中将不同的数量组合在一起

时间:2017-05-22 19:08:24

标签: mongodb mongodb-query aggregation-framework

如果我有一组对象,每个对象具有相同的描述,但具有不同的数量。

<img src='{{ asset("IMAGE_DIRECTORY_PATH/"~ image.url)}}' />

下面,我可以使用说明对其进行分组:

{

    {
    "_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
    }

}

是否可以在(_ ids:101,102和103加105,106,107)组中包含所有金额,即使它们的差异很小,但排除奖金金额,上面的示例是_id 104?

我不相信它可以在小组阶段完成,但有些事情可以在以后阶段完成,可以将_id 101,102和103组合在一起并排除_id 104.基本上,我想要MongoDB忽略101,102,103中的微小差异并将它们组合在一起,因为来自同一雇主的工资是。

我一直在使用 $ stdDevPop ,但无法获得稳固的公式。

我正在寻找只有_ids的简单数组输出。

{   “结果”:[       “101”,       “102”,       “103”,       “105”,       “106”,       “107”   ] }

2 个答案:

答案 0 :(得分:0)

db.yourDBNameHere.aggregate( [
  { $match: { "amount" : { $lt : 5000 } } },
  { $project: { _id: 1 } },
])

只会获取每件少于5000美元的交易的ID。

答案 1 :(得分:0)

你可以通过对&#34;金额&#34;进行一些数学计算来做到这一点。将其舍入到最接近的1000并将其用作分组_id

db.collection.aggregate([
  { "$group": {
      "_id": {
        "$subtract": [
           { "$trunc": "$amount" },
           { "$mod": [
             { "$trunc": "$amount" }, 
             1000
           ]}
         ]
      },
      "results": { "$push": "$_id" }
  }},
  { "$redact": {
    "$cond": {
      "if": { "$gt": [ { "$size": "$results" }, 1 ] },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }},
  { "$unwind": "$results" },
  { "$group": {
    "_id": null,
    "results": { "$push": "$results" }
  }}
])

如果你的MongoDB早于3.2,那么你只需要使用$mod $trunc所做的$redact的长格式。如果您的MongoDB早于2.6而不是$match,那么$sort。所以在更长的形式中,这是:

db.collection.aggregate([
  { "$group": {
      "_id": {
        "$subtract": [
           { "$subtract": [
             "$amount",
             { "$mod": [ "$amount", 1 ] }
           ]},
           { "$mod": [
             { "$subtract": [
               "$amount",
               { "$mod": [ "$amount", 1 ] }
             ]},
             1000
           ]}
         ]
      },
      "results": { "$push": "$_id" },
      "count": { "$sum": 1 }
  }},
  { "$match": { "count": { "$gt": 1 } } },
  { "$unwind": "$results" },
  { "$group": {
    "_id": null,
    "results": { "$push": "$results" }
  }}
])

无论哪种方式,输出都只是_id值,其数量按计数多次分组到边界。

{ "_id" : null, "results" : [ "105", "106", "107", "101", "102", "103" ] }

您可以在其中添加http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value,也可以在客户端代码中对结果数组进行排序。