首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb java聚合操作

mongodb java聚合操作
EN

Stack Overflow用户
提问于 2015-09-20 20:01:21
回答 1查看 142关注 0票数 0
代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-09-20 20:08:49

您需要在您的应用程序级别实现此操作,即使用Java代码。MongoDB是一个文档存储,所以它不支持集合之间的关系,您想要做的涉及到像movies -> user_id -> users -> friends这样的关系。您需要使用Java分别检索用户和电影,并在Java代码中实现联接。您不能用一个MongoDB查询就做到这一点。

假设一个用户不能成为他/她自己的朋友,我会这样做:

1)使用_id =(Your_user_id)从用户获取所有userFriends:

代码语言:javascript
复制
users.find({_id : (your_user_id)}, {userFriends.user_id : 1})

2)从具有一个userratings.user_id =(步骤1中的userFriends之一)的movies中获取所有文档。+ group by userratings.count + limit 5.如下所示:

代码语言:javascript
复制
movies.aggregate(
    [
        {$match : {userratings : {user_id : { $in (userFriends)}}},
        {$group : {_id : _id, count : {$sum : userratings.count}}},
        {$sort : {count : 1}},
        {$limit : 5}
    ]
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32679153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档