我有基于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
}
所以我需要编写解决两个任务的查询:
第一个很简单 - 我正在使用$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 。任何人都可以帮我解决这个问题,或者在我的案例中是否无法在一次操作中获得必要的数据?
答案 0 :(得分:0)
回答自己的问题:
上述任务是通过使用附加字段liked_users
解决的,它从某些角度重复用户标识符,但现在我可以轻松地:
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})