如何在Mongo中返回包含上述项目的有限数组?

时间:2015-09-21 13:01:13

标签: arrays mongodb

我有基于Mongo的服务,支持,如 / ,与论坛帖子的逻辑不同。以下是来自DB的示例帖子文档(省略所有帖子详细信息):

{
    "_id" : ObjectId("post_1"),
    ...
    "likes" : [ 
        {
            "user_id" : "user_1",
            "liked_at" : ISODate("2015-09-18T14:13:42.760Z")
        }, 
        {
            "user_id" : "user_2",
            "liked_at" : ISODate("2015-09-18T14:13:42.760Z")
        }, 
        {
            "user_id" : "user_3",
            "liked_at" : ISODate("2015-09-18T14:13:42.760Z")
        }, 
        {
            "user_id" : "user_4",
            "liked_at" : ISODate("2015-09-18T14:13:42.760Z")
        }, 
        {
            "user_id" : "user_5",
            "liked_at" : ISODate("2015-09-18T14:13:42.760Z")
        }
    ],
    "likes_number" : 5
}

所以我需要编写解决两个任务的查询:

  1. 限制喜欢 - 阵列 N ,例如返回3最后喜欢的帖子详细信息。
  2. 确定 - 用户是否喜欢这篇文章?
  3. 第一个很简单 - 我正在使用$slice运算符:

    db.posts.find(
        {
            "_id" : ObjectId("post_1")
        },
        {
            "likes" : {"$slice": -3}
        }
    )
    

    但我无法找到第二个解决方案。我需要在条件

    上计算任何逻辑标志
    if likes-array contains like with user_id equal to user_1 - return true
    

    看起来Mongo无法做到这一点。

    然后我决定从第1个任务返回 N 最后的喜欢,另外请求1个。例如。如果他喜欢帖子,则返回3最后的喜欢和+1喜欢 user_1 。任何人都可以帮我解决这个问题,或者在我的案例中是否无法在一次操作中获得必要的数据?

2 个答案:

答案 0 :(得分:0)

回答自己的问题:

上述任务是通过使用附加字段liked_users解决的,它从某些角度重复用户标识符,但现在我可以轻松地:

  1. 将likes-array限制为N,例如返回3最后喜欢的帖子详细信息。
  2. 确定 - 用户是否喜欢这篇文章
  3. Java方面只根据isLiked()数组的长度计算liked_users

    db.posts.find(
        {
            "_id" : ObjectId("post_1")
        },
        {
            "likes" : {"$slice": -3},
            "liked_users": {"$elemMatch": {"$in": "ANY_USER_ID"}}
        })
    

答案 1 :(得分:-1)

您可以使用$ elemMath运算符,例如

db.blog.find({_ id:“post_1”,赞:{$ elemMatch:{“user_id”:“user_7”}}},{_ id:1})