如何对 MongoDB 中的字段进行分组、区分和聚合

How to group, distinct and aggregate fields in MongoDB

我有一组文档,如下所示:

{
  '_id': ,
  'group': 'group1',
  'name': 'car; pet; bike'
},
{
  '_id': ,
  'group': 'group1',
  'name': 'car; pet; plant'
},
{
  '_id': ,
  'group': 'group2',
  'name': 'music; toy; cat'
},
{
  '_id': ,
  'group': 'group2',
  'name': 'dog'
},
{
  '_id': ,
  'group': 'group3',
  'name': 'star; planet'
}

我需要使用 .aggregate() 来获取以下内容:

{
  '_id': ,
  'group': 'group1',
  'name': 'car; pet; bike; plant'
},
{
  '_id': ,
  'group': 'group2',
  'name': 'music; toy; cat; dog'
},
{
  '_id': ,
  'group': 'group3',
  'name': 'star; planet'
}

因此,结果是一组字段 group 并连接字段 name 在值中做不同。

我不知道该怎么做。

如何做到?

也许是这样的:

 mongos> db.k.find()
 { "_id" : ObjectId("619e0e7830b7997817f9f634"), "group" : "group1" }
 { "_id" : ObjectId("619e0e9430b7997817f9f635"), "group" : "group1", "name" : "car; pet; bike" }
 { "_id" : ObjectId("619e0ea430b7997817f9f636"), "group" : "group1", "name" : "car; pet" }
 { "_id" : ObjectId("619e0eb530b7997817f9f637"), "group" : "group2", "name" : "car; pet" }
mongos> db.k.aggregate([ 
 { $project : { name : { $split: ["$name", " ;"] },group:1 }} ,
 { $unwind:"$name"} ,
 { $group:{_id:"$group" , name:{$addToSet:"$name"}}} ,
 { $addFields:{names:{$reduce:{input:{$slice:["$name",1,{$size:"$name"} ]},initialValue:{$arrayElemAt:["$name",0]},in:{$concat:["$$value"," ; ","$$this" ]}    }} }} , 
 { $project:{group:"$_id" , name:"$names" , _id:0 }}])

{ "group" : "group2", "name" : "car; pet" }
{ "group" : "group1", "name" : "car; pet; bike ; car; pet" }
mongos>

解释:

  1. 用“;”拆分数组名中的字符串
  2. 展开数组名
  3. group/join分组并组成数组名去重
  4. 添加新字段名称以加入
  5. 中的数组字符串
  6. 仅投影输出中预期的必要字段