【问题标题】:MongoDB aggregate: Unwind then summing leads to concatenated stringsMongoDB聚合:展开然后求和导致连接字符串
【发布时间】:2020-07-08 09:57:48
【问题描述】:

我有一个 mongo 集合,其中包含以下格式的文档:

{
   "_id" : 56345
   "location" : "Watertown"
   "grocery_stores" : [
      {
         "street": "Main"
         "size": 3243
         "name": "Main Street Deli"
      },
      {
         "street": "Western"
         "size": 13432
         "name": "Surplus Groceries"
      }
   ] 
}

我的目标是找出所有地点的每个杂货店名称的总数。为此,我使用了带有展开和分组的聚合管道。但是,返回的结果似乎是重新组合杂货店数组中的组件,而不是单独处理它们。

查询:

db.grocery.aggregate([
   {$project: {_id:1, location:1, stores:"$grocery_stores.name"}},
   {$unwind: "$stores"},
   {$group: {_id: "$stores"}},
   {$group: {_id:"$_id", count: {$sum:1}}}
])

预期结果

{ "_id" : "Main Street Deli", "count" : 1 }
{ "_id" : "Surplus Groceries", "count" : 1 }
...

取得的成果

{ "_id" : "Main Street Deli,Surplus Groceries", "count" : 1 }

我是否遗漏了一些明显的东西?

【问题讨论】:

  • 您的聚合查询返回如预期结果中所示的输出。那么,有什么问题呢?

标签: mongodb nosql aggregate


【解决方案1】:

你可以试试这样的

db.grocery.aggregate([{"$unwind":"$grocery_stores"},{ $group : { _id : "$grocery_stores.name" , count: {$sum: 1}} }])

结果

{ "_id" : "Surplus Groceries", "count" : 2 }
{ "_id" : "Main Street Deli", "count" : 3 }

【讨论】:

  • 感谢您的回答。当我运行您的查询时,我仍然遇到同样的问题,但如果我使用您的查询按grocery_stores.street 分组,它会按预期工作。我猜数据库有一些奇怪的底层结构,我看不到。谢谢
  • 我不确定您在运行我的查询时遇到了什么问题。删除 group stage 并首先运行并查看输出。然后你可以添加组回来。分组时,可以将其想象为每个杂货店名称都有存储桶,并且在存储桶中,每次找到相同的名称时,计数器都会增加 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 2011-02-20
  • 2015-02-14
相关资源
最近更新 更多