movies: {
_id: "1"
name: "comedy"
userratings: [{
user_id: "11",
count: 4
}, {
user_id: "22",
count: 2
}]
}
movies: {
_id: "2"
name: "funny"
userratings: [{
user_id: "22",
count: 8
}]
}
users: {
_id: "11",
name: "jhon",
userFriends: [{
user_id: "22"
}, {
user_id: "12"
}]
}
users: {
_id: "22",
name: "tom",
userFriends: [{
user_id: "11"
}]
}我有两个集合:用户和电影。用户集合由用户信息和他的朋友列表组成。movies集合包含电影信息和用户对电影的评分。
我的问题是:我如何找到被用户的朋友评分但没有被用户评分的电影,并根据好友评分的总和对它们进行排序,限制5条记录。
我正在使用java和mongodb
发布于 2015-09-20 20:08:49
您需要在您的应用程序级别实现此操作,即使用Java代码。MongoDB是一个文档存储,所以它不支持集合之间的关系,您想要做的涉及到像movies -> user_id -> users -> friends这样的关系。您需要使用Java分别检索用户和电影,并在Java代码中实现联接。您不能用一个MongoDB查询就做到这一点。
假设一个用户不能成为他/她自己的朋友,我会这样做:
1)使用_id =(Your_user_id)从用户获取所有userFriends:
users.find({_id : (your_user_id)}, {userFriends.user_id : 1})2)从具有一个userratings.user_id =(步骤1中的userFriends之一)的movies中获取所有文档。+ group by userratings.count + limit 5.如下所示:
movies.aggregate(
[
{$match : {userratings : {user_id : { $in (userFriends)}}},
{$group : {_id : _id, count : {$sum : userratings.count}}},
{$sort : {count : 1}},
{$limit : 5}
]
)https://stackoverflow.com/questions/32679153
复制相似问题