Mongodb 使用mongo db聚合框架进行求和

Mongodb 使用mongo db聚合框架进行求和,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我在mongo db的集合中有以下类型的文档 {u id:xx, iddoc:yy, 类型1:“sometype1”, 类型2:“sometype2”, 日期: { 年份:2015年, 月份:4, 日期:29, 类型:“日” }, 计数:23 } 我想对所有文档按iddoc进行字段计数分组求和,其中: 类型1在[“类型1A”、“类型1B”、…] 其中类型2位于[“类型2A”、“类型2B”、…] 日期.年份:2015年 日期.月份:4 date.type:“天” date.day介于4和7之

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

{u id:xx,
iddoc:yy,
类型1:“sometype1”,
类型2:“sometype2”,
日期:
{ 
年份:2015年,
月份:4,
日期:29,
类型:“日”
},
计数:23
}
我想对所有文档按iddoc进行字段计数分组求和,其中:

  • 类型1在[“类型1A”、“类型1B”、…]
  • 其中类型2位于[“类型2A”、“类型2B”、…]
  • 日期.年份:2015年
  • 日期.月份:4
  • date.type:“天”
  • date.day介于4和7之间
然后我想对这些总数进行排序


我认为这在mongo db聚合框架中可能很容易做到,但我对它还不熟悉,希望有一个开始的提示。

这是一个简单的方法:

db.test.aggregate([
//根据您的条件筛选文档
{$match:{
类型1:{$in:['type1A','type1B']},
类型2:{$in:['type2A','type2B']},
“日期.年份”:2015年,
“日期.月份”:4,
“date.type':“day”,
'date.day':{$gte:4,$lte:7}
}},
//按iddoc分组并计数
{$group:{
_id:“$iddoc”,
总和:{$sum:1}
}},
//按和、降序排序
{$sort:{sum:-1}}
])

这对于一个:

db.test.aggregate([
//根据您的条件筛选文档
{$match:{
类型1:{$in:['type1A','type1B']},
类型2:{$in:['type2A','type2B']},
“日期.年份”:2015年,
“日期.月份”:4,
“date.type':“day”,
'date.day':{$gte:4,$lte:7}
}},
//按iddoc分组并计数
{$group:{
_id:“$iddoc”,
总和:{$sum:1}
}},
//按和、降序排序
{$sort:{sum:-1}}
])

这对于一个:

db.test.aggregate([
//根据您的条件筛选文档
{$match:{
类型1:{$in:['type1A','type1B']},
类型2:{$in:['type2A','type2B']},
“日期.年份”:2015年,
“日期.月份”:4,
“date.type':“day”,
'date.day':{$gte:4,$lte:7}
}},
//按iddoc分组并计数
{$group:{
_id:“$iddoc”,
总和:{$sum:1}
}},
//按和、降序排序
{$sort:{sum:-1}}
])

这对于一个:

db.test.aggregate([
//根据您的条件筛选文档
{$match:{
类型1:{$in:['type1A','type1B']},
类型2:{$in:['type2A','type2B']},
“日期.年份”:2015年,
“日期.月份”:4,
“date.type':“day”,
'date.day':{$gte:4,$lte:7}
}},
//按iddoc分组并计数
{$group:{
_id:“$iddoc”,
总和:{$sum:1}
}},
//按和、降序排序
{$sort:{sum:-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之间(含4和7)的字段date.day(如果不是,则使用$gt和$lt将其排除)。它将结果从低到高(升序)排序,如果要进行降序排序,则:


{$sort:{total_count:-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之间(含4和7)的字段date.day(如果不是,则使用$gt和$lt将其排除)。它将结果从低到高(升序)排序,如果要进行降序排序,则:


{$sort:{total_count:-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之间(含4和7)的字段date.day(如果不是,则使用$gt和$lt将其排除)。它将结果从低到高(升序)排序,如果要进行降序排序,则:


{$sort:{total_count:-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之间(含4和7)的字段date.day(如果不是,则使用$gt和$lt将其排除)。它将结果从低到高(升序)排序,如果要进行降序排序,则:


{$sort:{total_count:-1}}

谢谢。不仅可以按iddoc分组,还可以按type1分组吗?例如,多组byYes:
\u id:{iddoc:'$iddoc',type1:'$type1'}
如果具有不同类型1的文档具有不同名称的计数字段,我将如何对iddoc和type1执行多组by?即,如果type1为type1A,则计数字段名为counttype1A;如果type1为type1B,则计数字段名为counttype1B。我只想对counttype1A和counttype1b求和,这可能是一个最好的新问题。谢谢。不仅可以按iddoc分组,还可以按type1分组吗?例如,多组byYes:
\u id:{iddoc:'$iddoc',type1:'$type1'}
如果具有不同类型1的文档具有不同名称的计数字段,我将如何对iddoc和type1执行多组by?即,如果type1为type1A,则计数字段名为counttype1A;如果type1为type1B,则计数字段名为counttype1B。我只想对counttype1A和counttype1b求和,这可能是一个最好的新问题。谢谢。不仅可以按iddoc分组,还可以按type1分组吗?例如,多组byYes:
\u id:{iddoc:'$iddoc',type1:'$type1'}
如果具有不同类型1的文档具有不同名称的计数字段,我将如何对iddoc和type1执行多组by?即,如果type1为type1A,则计数字段名为counttype1A;如果type1为type1B,则计数字段名为counttype1B。我只想对counttype1A和counttype1b求和,这可能是一个最好的新问题。谢谢。不仅可以按iddoc分组,还可以按type1分组吗?例如,多组byYes:
\u id:{iddoc:'$iddoc',type1:'$type1'}
如果具有不同类型1的文档具有不同名称的计数字段,我将如何对iddoc和type1执行多组by?即,如果type1为type1A,则计数字段名为counttype1A;如果type1为type1B,则计数字段名为counttype1B。我只想对counttype1A和counttype1b求和,这可能是一个最好的新问题。