Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 子单据多字段Mongo查询_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb 子单据多字段Mongo查询

Mongodb 子单据多字段Mongo查询,mongodb,mongodb-query,Mongodb,Mongodb Query,假设我有一个这样的收藏: { "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, { "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, { "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] } db.collection.f

假设我有一个这样的收藏:

{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] }
db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});
我想找到所有
arr
包含一个子文档的文档,该子文档的
名称
=“b”和
num
=2

如果我执行这样的查询:

{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] }
db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});
它将返回集合中的所有文档,因为每个文档都包含一个子文档,该子文档的
名称
为“b”,或者
num
为2

我也试过:

db.collection.find({
    arr: [
        { "name": "b", "num": 2 }
    ]
});
它不会抛出任何错误,但不会返回任何结果

如何在MongoDB中查询多个子文档字段?

这实际上是运算符的作用,尽管它经常被误用。它本质上对数组中的每个元素执行查询条件。除非另有明确调用,否则所有MongoDB参数都是“and”操作:

db.collection.find({“arr”:{“$elemMatch”:{“name”:“b”,“num”:2}}})
如果只需要匹配的字段,而不需要匹配的字段,那么您可能也希望在此处“投影” 整个文件:

db.collection.find(
{“arr”:{“$elemMatch”:{“name”:“b”,“num”:2}}},
{“arr.$”:1}
)
最后,要解释第二次尝试失败的原因,请执行以下查询:

db.collection.find({
“arr”:[
{“name”:“b”,“num”:2}
]
})
不匹配任何内容,因为没有实际文档中“arr”包含与您的条件完全匹配的单个元素

您的第一个示例失败..:

db.collection.find({
美元及:[
{“arr.name”:“b”},
{“arr.num”:2}
]
});

因为有多个数组元素满足这些条件,这不仅仅是因为这两个条件都适用于同一个元素。这就是
$elemMatch
所添加的内容,当您需要匹配多个条件时,这就是您使用它的地方。

非常有用且完整的答案,很抱歉无法进行两次投票。谢谢你,尼尔!