如何对 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>
解释:
- 用“;”拆分数组名中的字符串
- 展开数组名
- group/join分组并组成数组名去重
- 添加新字段名称以加入
中的数组字符串
- 仅投影输出中预期的必要字段
我有一组文档,如下所示:
{
'_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>
解释:
- 用“;”拆分数组名中的字符串
- 展开数组名
- group/join分组并组成数组名去重
- 添加新字段名称以加入 中的数组字符串
- 仅投影输出中预期的必要字段