我有以下文件:
{
_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的文件,如果不存在则失败。
答案 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 以这种方式匹配的方式。