【问题标题】:Keeping field in mongodb group by将字段保存在 mongodb 组中
【发布时间】:2015-03-10 13:10:30
【问题描述】:

我在 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 之间

然后我想对这些总和进行排序。

我现在知道怎么做(见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}}
])

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

【问题讨论】:

  • 按照您目前的方式包含查询可能是个好主意。我知道它基本上显示在您上一个问题的答案中,但是在这个问题的答案中提供参考会很好。
  • 好点我在上面加了。

标签: mongodb aggregation-framework


【解决方案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' }
  }},

【讨论】:

  • 谢谢。当我运行此查询时,它告诉我我不能在 $group 阶段使用 $date.year 或 $name.subname 因为组字段名称不能包含 .在他们之中。我想这是一个 mongodb 限制?
  • 好吧,“$name.subname”没有出现在我在回答中写的查询中,所以你肯定没有完全按照写的方式运行查询。此外,在我的查询中,'$date.year' 没有被用作字段名称 - 它引用了 'date' 对象中的 'year' 的值。如果没有看到您实际输入的确切查询,我无法确切知道如何帮助您解决它....但是我可以提供一个线索:我在答案中的第一个查询中的字段名称是“_id”, “sum”、“type2”、“year”、“month”和“day”。这些是$group 中看起来不像'$date.year' 的部分。
  • 你能解决这个问题吗?您想获得更多帮助吗?
  • 谢谢。另一个问题(这可能是不可能的)是:当我按 iddoc 和 type1 分组时,我实际上想对文档中名为 count 的字段求和。不幸的是,对于不同的 type1 类型,该字段的名称是不同的。有没有一种方法可以分别对这些中的每一个进行求和,或者唯一的选择是不按 type1 进行分组并循环遍历按 iddoc 对每个进行分组的类型?
  • 我不完全理解您正在考虑的两个潜在解决方案,但这听起来是一个足够复杂的问题(我知道您以前听说过)应该是一个单独的问题。如果我已经解决了您在这个问题中提出的问题,请务必勾选我的解决方案。谢谢,期待您的下一个问题!
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 2023-04-10
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2017-07-13
  • 1970-01-01
相关资源
最近更新 更多