gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:50:25 25 4
gpt4 key购买 nike

这是我的收藏:

{ "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" 进行分组时,您正在为两个或多个 "user" 值寻找“排列”。这不是您真正从“数据库”查询中获得的那种东西。

但是如果你$group“电影”$push 上其他数据,然后您可以过滤掉该数组中少于两个条目的任何内容,并从那里计算出您的“可能组合”。所以你可以让数据库做分组和过滤,剩下的就是“集合论”中的算法。

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

db.movies.aggregate([
{ "$group": {
"_id": "$movie",
"people": {
"$push": {
"user": "$user",
"rate": "$rate"
}
}
}},
{ "$redact": {
"$cond": {
"if": { "$gt": [{ "$size": "$people" }, 1] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$sort": { "_id": 1 } }
]).forEach(function(doc) {
var n = doc.people.length;
var i,j;

for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
printjson({
"user1": doc.people[i].user,
"rate1": doc.people[i].rate,
"user2": doc.people[j].user,
"rate2": doc.people[j].rate,
"movie": doc._id
})
}
}
})

所以聚合部分本身首先做一个$group"movie" 值上如前所述,并使用 $push 创建数组.由于并非所有结果都会有一个包含多个条目的数组,因此您可以删除带有 $redact 的那些.这是一个使用 $size 的“逻辑过滤器”比较生成的数组,看看它是否有“多于”($gt)一个条目。

在应用 $sort 之后,此阶段的结果如下所示:

{
"_id" : 1,
"people" : [
{
"user" : 1,
"rate" : 1
},
{
"user" : 2,
"rate" : 4
}
]
}
{
"_id" : 3,
"people" : [
{
"user" : 1,
"rate" : 3
},
{
"user" : 2,
"rate" : 2
},
{
"user" : 3,
"rate" : 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 }

关于mongodb - 如何聚合以获得每个电影分组键两个用户的每个组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36497097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com