与mongodb聚合框架进行总结

时间:2015-01-12 15:04:44

标签: mongodb aggregation-framework

我在mongo db

的集合中有以下类型的文档
{   _id:xx, 
    iddoc:yy,   
    type1:"sometype1", 
    type2:"sometype2",
    date: 
    { 
      year:2015,
      month:4,
      day:29,
      type:"day"
    },
    count:23 
}

我想对所有文档的iddoc字段数分组进行总结:

  • type1 in [" type1A"," type1B",...]
  • 其中type2在[" type2A"," type2B",...]
  • date.year:2015,
  • date.month:4,
  • date.type:" day"
  • date.day 4到7之间

我希望对这些总和进行排序。

我认为在mongo db聚合框架中这可能很容易,但我是新手,并希望得到一个提示。

2 个答案:

答案 0 :(得分:2)

这对aggregation pipeline

很简单
db.test.aggregate([
  // Filter the docs based on your criteria
  {$match: {
    type1: {$in: ['type1A', 'type1B']},
    type2: {$in: ['type2A', 'type2B']},
    'date.year': 2015,
    'date.month': 4,
    'date.type': 'day',
    'date.day': {$gte: 4, $lte: 7}
  }},

  // Group by iddoc and count them
  {$group: {
    _id: '$iddoc',
    sum: {$sum: 1}
  }},

  // Sort by sum, descending
  {$sort: {sum: -1}}
])

答案 1 :(得分:1)

如果我理解正确的话:

db.col.aggregate
(
  [{
    $match:
    {
      type1: {$in: ["type1A", type1B",...]},
      type2: {$in: ["type2A", type2B",...]},
      "date.year": 2015,
      "date.month": 4,,
      "date.day": {$gte: 4, $lte: 7},
      "date.type": "day" 
    }
  },
  {
    $group:
    {
       _id: "$iddoc",
       total_count: {$sum: "$count"}
    }  
  },
  { $sort: {total_count: 1}}]
)

这会过滤4到7之间的字段date.day(如果不是,请使用$ gt和$ lt来排除它们)。并且它将结果从较低到较高(升序)排序,如果你想做降序排序,那么:

{$ sort:{total_count:-1}}