【问题标题】:MongoDB aggregate and countMongoDB聚合和计数
【发布时间】:2016-12-25 14:11:23
【问题描述】:

集合中名为“myCollection”的文档如下所示:

{ 
    _id : 57b4b4e028108d801738a472, 
    updatedAt : 2016-08-17T19:03:01.831+0000, 
    createdAt : 2016-08-17T19:02:56.887+0000, 
    from : 57b1c2fc4bf55ba009b36c84, 
    to : 57b1c75e4bf55ba009b36c85, 
}

我需要计算 'from' 和 'to' 的出现次数,最终得到这样的文档集合:

{ 
    "_id" : 7b1c2fc4bf55ba009b36c84, 
    "occurredInFrom" : 12, 
    "occurredInTo" : 16
}

其中 _id 来自“$from”或“$to”。

我写的不正确的聚合查询是这样的:

{
  $group: {
     _id: "$from",
      occurredInFrom: { $sum: 1 },
      occurredInTo: { $sum: 1}
  }
} 

我绝对可以看到 _id: "$from" 是不够的。你能告诉我正确的方法吗?

注意:“myCollection”的结构不是最终的,如果您认为有更好的结构,请提出建议。

【问题讨论】:

标签: mongodb mongodb-query aggregation-framework mongodb-aggregation


【解决方案1】:

试试这个

db.myCollection.aggregate([
  { $project:
    { _id: 0,
      dir: [
        {id:"$from", from:{"$sum":1}, to:{"$sum":0}},
        {id:"$to", from:{"$sum":0}, to:{"$sum":1}}
      ]
    }
  },
  { $unwind : "$dir" },
  { $group:
    {
      _id: "$dir.id",
      occurredInFrom: { $sum: "$dir.from" },
      occurredInTo: { $sum: "$dir.to" }
    }
  }
])

【讨论】:

  • 异常:对象表达式中不允许的字段类型数组(在'dir'处),代码:15992
  • 可能是我的数据库版本,3.0 mongolab沙箱。我会尝试找到一种方法让它在这个旧版本中工作。谢谢。
  • 我可以确认您的回答对于 MongoDB 3.2 是正确的,在该版本中 $project supports array fields。如果您能想到 3.0 解决方案($project 中没有方括号),请分享。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2013-11-23
  • 2020-11-09
  • 2019-05-28
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多