为什么找不到'$ all'修饰符的文档?

时间:2014-02-20 03:59:20

标签: javascript node.js mongodb mongodb-query

我有以下文件:

{
   _id: 1
   title: "oneItem"
},
{
   _id: 2,
   title: "twoItem"
}

当我尝试使用以下命令查找这些文档时:

db.collection.documents.find({_id: {$in: [1, 2]}});

我得到这两个文件但是当我尝试使用以下查询找到这些文档时:

db.collection.documents.find({_id: {$all: [1, 2]}});

我一无所获。你能解释一下这是什么问题吗?基本上我需要找到所有带有_id 1和2的文件,如果不存在则失败。

1 个答案:

答案 0 :(得分:2)

推理实际上非常简单,因为$in$all有两个完全不同的功能。文档链接在那里,但要解释:

考虑这些文件:

{
   _id: 1,
   items: [ "a", "b" ]
},
{
   _id: 2,
   items: [ "a", "b", "c" ]
}

$ in - 提供一个 list 参数,这些参数可能与正在测试的字段中的值匹配。这将匹配如下:

db.collection.find({ items: {$in: [ "a", "b", "c" ] }})

{
   _id: 1,
   items: [ "a", "b" ]
},
{
   _id: 2,
   items: [ "a", "b", "c" ]
}

$ all - 提供一个列表,其中匹配的字段应为数组,并且列出的元素的全部存在于该数组中。 E.g

db.collection.find({ items: {$all: [ "a", "b", "c" ] }})

{
   _id: 2,
   items: [ "a", "b", "c" ]
}

因此,为什么您的查询不返回结果,该字段不是数组,并且不包含两个元素。

MongoDB operator reference是您应该真正阅读的内容。

作为您的陈述,[“我需要找到所有带有_id 1和2的文件,如果其中某人不存在则失败。”],符合各种标准 easy 如您所见使用 $ in 。您的问题是您希望整套匹配或以其他方式返回任何内容(“失败”)。我已经在previous question向你解释了一段长度,但要重新迭代:

db.collection.aggregate([
    // Match on what you want to find
    {$match: { list: {$in: [1,2]} }},

    // Add the found results to a distinct *set*
    {$group: { _id: null, list: {$addToSet: "$_id"} }},

    // Only return when *all* the expected items are in the *set*
    {$match: { list: {$all: [1,2]} }}
])

因此,在该操作之后,只有在找到所有项目的全部时才会返回结果。这就是我们使用 $ all 以这种方式匹配的方式。