如何按字段对文档进行分组
How to group documents by field
假设我的 mongo collection 中有一个这样的文档。
{
actorId:"101"
movieType:"action"
movieName:"movie1"
},
{
actorId:"102"
movieType:"comedy",
movieName:"movie2"
},
{
actorId:"101"
movieType:"action",
movieName:"movie3"
},
{
actorId:"101"
movieType:"comedy"
name:"movie4",
},
{
actorId:"102"
movieType:"action"
movieName:"movie5"
}
我想知道代理喜欢的不同类型的电影
agents:[
{
id:101,
Movietypes:[
{
type:"action",
count:2
},
{
type:"comedy",
count:1
}
]
}
]
如果有人能指导我如何获得上述回复,那将非常有帮助。我搜索了但没有找到任何解决方案,寻求您的帮助
您可以先使用$group
on actorId
and movieType
with $sum
来计算每个演员的每种电影类型。然后另一个 $group
阶段将每个演员的所有电影类型累积到 1 个文档中。
[
{
'$group': {
'_id': {
'actorId': '$actorId',
'movieType': '$movieType'
},
'count': {
'$sum': 1
}
}
}, {
'$group': {
'_id': '$_id.actorId',
'movieTypes': {
'$push': {
'type': '$_id.movieType',
'count': '$count'
}
}
}
}
]
这将 return 多个文档(每个演员 1 个)并包含 movieTypes
数组,如下面的屏幕截图所示。
如果你想 return 带有 agents
数组的单个文档,那么你可以添加另一个阶段,如下所示:
{
'$group': {
'_id': null,
'agents': {
'$push': {
'id': '$_id',
'movieTypes': '$movieTypes'
}
}
}
}
加入第三个小组赛阶段后的输出将是:
假设我的 mongo collection 中有一个这样的文档。
{
actorId:"101"
movieType:"action"
movieName:"movie1"
},
{
actorId:"102"
movieType:"comedy",
movieName:"movie2"
},
{
actorId:"101"
movieType:"action",
movieName:"movie3"
},
{
actorId:"101"
movieType:"comedy"
name:"movie4",
},
{
actorId:"102"
movieType:"action"
movieName:"movie5"
}
我想知道代理喜欢的不同类型的电影
agents:[
{
id:101,
Movietypes:[
{
type:"action",
count:2
},
{
type:"comedy",
count:1
}
]
}
]
如果有人能指导我如何获得上述回复,那将非常有帮助。我搜索了但没有找到任何解决方案,寻求您的帮助
您可以先使用$group
on actorId
and movieType
with $sum
来计算每个演员的每种电影类型。然后另一个 $group
阶段将每个演员的所有电影类型累积到 1 个文档中。
[
{
'$group': {
'_id': {
'actorId': '$actorId',
'movieType': '$movieType'
},
'count': {
'$sum': 1
}
}
}, {
'$group': {
'_id': '$_id.actorId',
'movieTypes': {
'$push': {
'type': '$_id.movieType',
'count': '$count'
}
}
}
}
]
这将 return 多个文档(每个演员 1 个)并包含 movieTypes
数组,如下面的屏幕截图所示。
如果你想 return 带有 agents
数组的单个文档,那么你可以添加另一个阶段,如下所示:
{
'$group': {
'_id': null,
'agents': {
'$push': {
'id': '$_id',
'movieTypes': '$movieTypes'
}
}
}
}
加入第三个小组赛阶段后的输出将是: