返回不包含特定内部数组项的

时间:2016-10-08 17:40:37

标签: mongodb join mongoose mongodb-query

如何返回一组文档,每个文档都不包含内部数组中的特定项目?

我的数据方案是:

文章:

{ 
    "_id" : ObjectId("57f91ec96241783dac1e16fe"), 
    "votedBy" : [
        {
            "userId" : "101",
            "vote": 1
        }, 
        {
            "userId" : "202",
            "vote": 2
        }
    ], 
    "__v" : NumberInt(0)
}

我想返回一组帖子,其中包含任何一个votedBy数组项中的给定userId。 官方文件暗示这是可能的:

MongoDB documentation: Field with no specific array index

虽然它返回一个空集(对于查找具有特定数组项的文档的更简单的情况)。 似乎我必须知道一组正确结果的索引,例如: votedBy.0.userId。

This问题是我找到的最接近的解决方案(应用于我的方案):

db.collection.find({"votedBy": { $not: {$elemMatch: {userId: 101 } } } })

如果数组中唯一的内部文档与我希望不返回的文档匹配,它可以正常工作,但在我上面指定的示例中,文档返回,因为它找到userId = 202内部文档。

只是为了澄清:我想要返回所有文件,他们所投票的任何数组项目都没有给定的userId。

我还尝试了一个更简单的数组,只包含userId作为字符串数组,但是,每个数组都接收一个Id,搜索过程也是一样。

我尝试的另一个解决方案是为uservotes使用不同的集合,并应用查找来执行类似SQL的连接,但似乎有一种更简单的方法。

我正在使用mongoose(node.js)。

1 个答案:

答案 0 :(得分:1)

嵌入式$ne上的用户userId

db.collection.find({'votedBy.userId': {$ne: '101'}})

它将使用至少一个userId = "101"

元素过滤所有文档