保持字段在蒙戈布组由



我在 mongo db 的集合中有以下类型的文档

{ _id:xx,

iddoc:yy,   
type1:"sometype1", 
type2:"sometype2",
date: 
{ 
  year:2015,
  month:4,
  day:29,
  type:"day"
},
count:23  }

我想对所有文档按 iddoc 分组的字段计数进行求和,其中:

键入 1 在 ["type1A","type1B",...] 中,其中键入 2 在 ["type2A","type2B",...] 日期年份: 2015, 日期.月份: 4, 日期.类型: "日"日期.4 到 7 之间的日期

然后我想对这些金额进行排序。

我现在知道如何做到这一点(见这个问题)

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}}
])

但希望匹配操作中的某些字段出现在最终文档中。这可能吗?如何?

我相信

这个查询是您所问的解决方案:

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' }
  }},

最新更新