检查集合

时间:2017-03-19 22:44:57

标签: node.js mongodb mongodb-query aggregation-framework

所以在我的MongoDB数据库中,我有一个收集用户帖子的集合。

在该集合中,我有一个名为" likes"的集合,其中包含一些喜欢该帖子的用户的ID。在查询时我想将用户id传递给我的查询并在结果中有一个布尔值告诉我数组中是否存在id以查看用户是否已经喜欢该帖子。我理解这对于两个查询很容易,一个用于获取帖子,一个用于检查用户是否喜欢它,但我想找到最有效的方法来执行此操作。

例如,我的一个文档看起来像这样

{
    _id: 24jef247jos991,
    post: "Test Post",
    likes: ["userid1", "userid2"]
}

当我从" userid1"查询时我想要回归

{
    _id: 24jef247jos991,
    post: "Test Post",
    likes: ["userid1", "userid2"],
    userLiked: true
}

但是,当我从let'来说," userid3"我想

{
    _id: 24jef247jos991,
    post: "Test Post",
    likes: ["userid1", "userid2"],
    userLiked: false
}

2 个答案:

答案 0 :(得分:2)

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

db.collection.aggregate( [
        {
           $addFields: {
              "userLiked":{ $in: [ "userid1", "$likes" ] }
           }
        }
] )

答案 1 :(得分:1)

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

db.collection.aggregate( [
   { "$addFields": { "userLiked": { "$in": [ "userid1", "$likes" ] } } }
])

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

db.collection.aggregate([
    { "$project": { 
        "post": 1, "likes": 1, 
        "userLiked": { "$setIsSubset": [ [ "userid3" ], "$likes" ] } 
    }}
])

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