保持在mongodb组的领域

时间:2015-01-12 17:29:11

标签: 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 in   [" type2A"," type2B",...] date.year:2015,date.month:4,date.type:   "天" date.day在4到7之间

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

我现在知道如何做到这一点(见this question

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 个答案:

答案 0 :(得分:4)

我相信这个查询是您所要求的解决方案:

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 type1 and count them
  {$group: {
    _id: { iddoc: '$iddoc', type1: '$type1' },
    sum: {$sum: 1},
    type2: { $push: '$type2' },
    year: { $first: '$date.year' },
    month: { $first: '$date.month' },
    day: { $addToSet: '$date.day' }
  }},

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

您可以选择如何查看其余字段。我选择将type2推送到一个数组(允许重复),取yearmonth的第一个值,因为每个匹配操作始终为2015和4,addToSet阵列的一天(不允许重复)。 另一个选择是将整个文档推送到一个匹配数组中,但是在大型集合中应该小心。

{$group: {
    _id: { iddoc: '$iddoc', type1: '$type1' },
    sum: {$sum: 1},
    matches: { $push: '$$ROOT' }
  }},