Mongodb从组内计算数组中元素出现次数

3

我有一个问题,我想要获取数组中某个元素出现的次数,而且还要将它们分组。

这是我的架构:

{
   "name": "John Doe",
   "age": 20,
   "address": "Nasipit, Talamban, Cebu City, Cebu",
   "visitors": [
     {
       "_id": {
         "$oid": "5de5a8271a91ca42fc5fc593"
       },
       "firstname": "Jane Doe",
       "lastname": "Tanilon",
       "address": "California",
       "date": "December 3rd 2019, 8:11:19 am"
     },
     {
       "_id": {
         "$oid": "5de5a8271a91ca42fc5fc593"
       },
       "firstname": "Nice",
       "lastname": "One",
       "address": "California",
       "date": "December 3rd 2019, 8:11:19 am"
     }
     ]
}

我试着将它们分组:

db.visitors.aggregate({
    $group: {_id: '$visitors.address',count:{$sum:1}}
})

结果是:

{ "_id" : [ "加利福尼亚州", "加利福尼亚州"], "count" : 1 }

我想要像这个数组一样计算“加利福尼亚州”的出现次数:

{ "_id" : "加利福尼亚州", "count" : 2 }

2个回答

3

表达式'$visitors.address'返回了一个数组,而你需要单独计算访客数组文档的数量。为此,在运行$group之前,您需要$unwind该数组:

db.visitors.aggregate([
    { $unwind: "$visitors" },
    {
        $group: {_id: '$visitors.address',count:{$sum:1}}
    }
])

我以前从未使用过 $unwind,因为我是 MongoDB 的新手,无论如何,谢谢你救了我的命! - Chervin Tanilon

1
下面的聚合查询计算所有文档中“California”的出现次数。
var INPUT_PARAM = "California"

db.test.aggregate( [
{ 
  $unwind: "$visitors" 
},
{ 
  $group: { 
      _id: null, 
      count: { 
          $sum: { 
              "$cond": [ 
                  { "$eq": [ "$visitors.address", INPUT_PARAM ] }, 
                    1, 
                    0 
              ] 
          } 
      } 
  } 
},
{ 
  $project: { 
      _id: INPUT_PARAM, 
      count: 1 
  } 
}
] )

当输入文档为以下内容时,结果为:{ "count" : 3, "_id" : "California" }

The input documents are:

{ _id: 11,
   "name": "John Doe",
   "address": "Nasipit, Talamban, Cebu City, Cebu",
   "visitors": [
     {
       "_id": 1,
       "firstname": "Jane Doe",
       "address": "California",
     },
     {
       "_id": 2,
       "firstname": "Nice",
       "address": "California",
     },
       {"_id": 3,
       "firstname": "Jack",
       "address": "Texas",
     }
    ]
},
{ _id: 22,
   "name": "Miller",
   "address": "14, North 5th St., New York",
   "visitors": [
     {
       "_id": 95,
       "firstname": "ABC",
       "address": "California",
     },
       { "_id": 96,
       "firstname": "XYZ",
       "address": "Maine",
     }
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接