首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查集合中是否存在元素的最有效方法

检查集合中是否存在元素的最有效方法
EN

Stack Overflow用户
提问于 2017-03-19 22:44:57
回答 2查看 522关注 0票数 0

因此,在我的MongoDB数据库中,我有一个包含用户帖子的集合。

在该集合中,我有一个名为“喜好”的集合,它包含了喜欢该帖子的用户的ids数组。在查询时,我希望将一个用户id传递给我的查询,并在结果中包含一个布尔值,告诉我该id是否存在于数组中,以查看用户是否已经喜欢这个帖子。我知道这很容易通过两个查询来实现,一个是获取帖子,另一个是检查用户是否喜欢它,但是我想找到最有效的方法来完成这个任务。

例如,我的一个文档如下所示

代码语言:javascript
运行
复制
{
    _id: 24jef247jos991,
    post: "Test Post",
    likes: ["userid1", "userid2"]
}

当我从"userid1“查询时,我希望返回

代码语言:javascript
运行
复制
{
    _id: 24jef247jos991,
    post: "Test Post",
    likes: ["userid1", "userid2"],
    userLiked: true
}

但是当我从"userid3“中查询时,我想

代码语言:javascript
运行
复制
{
    _id: 24jef247jos991,
    post: "Test Post",
    likes: ["userid1", "userid2"],
    userLiked: false
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-19 23:16:35

您可以添加$addFields阶段,根据输入用户检查每个文档likes数组。

代码语言:javascript
运行
复制
db.collection.aggregate( [
        {
           $addFields: {
              "userLiked":{ $in: [ "userid1", "$likes" ] }
           }
        }
] )
票数 2
EN

Stack Overflow用户

发布于 2017-03-20 10:09:53

从MongoDB 3.4开始,您可以使用$in聚合操作符来检查数组是否包含给定的元素。可以使用$addFields运算符聚合运算符将新计算的值添加到文档中,而无需显式地包含其他字段。

代码语言:javascript
运行
复制
db.collection.aggregate( [
   { "$addFields": { "userLiked": { "$in": [ "userid1", "$likes" ] } } }
])

在MongoDB 3.2中,您可以使用$setIsSubset运算符和方括号[]运算符来完成此操作。这种方法的缺点是您需要手动$project文档中的所有字段。此外,$setIsSubset操作符与去复制您的数组,这可能不是您想要的。

代码语言:javascript
运行
复制
db.collection.aggregate([
    { "$project": { 
        "post": 1, "likes": 1, 
        "userLiked": { "$setIsSubset": [ [ "userid3" ], "$likes" ] } 
    }}
])

最后,如果您的mongod版本是3.0或更高版本,则需要使用$literal运算符而不是[]运算符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42893212

复制
相关文章

相似问题

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