Mongodb 如何聚合以获得每个电影分组键的两个用户的每个组合?

Mongodb 如何聚合以获得每个电影分组键的两个用户的每个组合?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,这是我的收藏: { "user" : 1, "rate" : 1, "movie" : 1} { "user" : 1, "rate" : 3, "movie" : 3} { "user" : 1, "rate" : 2, "movie" : 4} { "user" : 1, "rate" : 3, "movie" : 5} { "user" : 2, "rate" : 4, "movie" : 1} { "user" : 2, "rate" : 2, "movie" : 3} { "user"

这是我的收藏:

{ "user" : 1, "rate" : 1, "movie" : 1}
{ "user" : 1, "rate" : 3, "movie" : 3}
{ "user" : 1, "rate" : 2, "movie" : 4}
{ "user" : 1, "rate" : 3, "movie" : 5}
{ "user" : 2, "rate" : 4, "movie" : 1}
{ "user" : 2, "rate" : 2, "movie" : 3}
{ "user" : 2, "rate" : 5, "movie" : 6}
{ "user" : 3, "rate" : 1, "movie" : 3}
以下是我想要得到的结果:

{ "user1" : 1, "rate1" : 1,"user2" : 2, "rate2" : 4, "movie" : 1}
{ "user1" : 1, "rate1" : 3,"user2" : 2, "rate2" : 2, "movie" : 3}
{ "user1" : 1, "rate1" : 3,"user2" : 3, "rate2" : 1, "movie" : 3}
{ "user1" : 2, "rate1" : 2,"user2" : 3, "rate2" : 1, "movie" : 3}
对于每一部“电影”,即“用户”和“费率”值的每一对组合,其中该“电影”有多个“用户”

您在对两个或多个
“用户”
值分组时,正在寻找“排列”。这不是从“数据库”查询中真正得到的东西

但是,如果您使用
“movie”
和其他数据,则可以过滤出该数组中少于两个条目的任何内容,并从中计算出“可能的组合”。因此,您可以要求数据库进行分组和筛选,但其余的是“集合论”中的算法

这就是“部分”聚合语句和结果中代码的“部分”处理:

db.movies.aggregate([
{“$组”:{
“_id”:“$movie”,
“人”:{
“$push”:{
“用户”:“$user”,
“费率”:“$费率”
}
}
}},
{“$redact”:{
“$cond”:{
“如果”:{“$gt”:[{“$size”:“$people”},1]},
“然后”:“$$KEEP”,
“else”:“$$PRUNE”
}
}},
{“$sort”:{“\u id”:1}
]).forEach(功能(文档){
var n=doc.people.length;
varⅠ,j;
对于(i=0;i
因此,聚合部分本身首先对前面提到的
“movie”
值执行一个操作,并使用创建数组。由于并非所有结果都有一个包含多个条目的数组,因此您可以删除包含多个条目的数组。这是一个“逻辑过滤器”,用于比较生成的数组,并查看它是否有“多”()个条目

这一阶段的结果如下:

{
“_id”:1,
“人”:[
{
“用户”:1,
“费率”:1
},
{
“用户”:2,
“费率”:4
}
]
}
{
“_id”:3,
“人”:[
{
“用户”:1,
“费率”:3
},
{
“用户”:2,
“费率”:2
},
{
“用户”:3,
“费率”:1
}
]
}
下一部分实际上取决于生成可能的“配对”组合的“算法”。这是一种非常常见且众所周知的方法,因此您只需在响应返回的每个文档的数组上运行循环即可生成结果:

{“user1:1”,rate1:1,“user2:2”,rate2:4,“movie:1}
{“user1”:1,“rate1”:3,“user2”:2,“rate2”:2,“movie”:3}
{“user1”:1,“rate1”:3,“user2”:3,“rate2”:1,“movie”:3}
{“user1”:2,“rate1”:2,“user2”:3,“rate2”:1,“movie”:3}

感谢您回答我的问题,这完全解决了我的问题。