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 默认情况下,查找筛选器为AND时,$elemMatch有什么好处_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb 默认情况下,查找筛选器为AND时,$elemMatch有什么好处

Mongodb 默认情况下,查找筛选器为AND时,$elemMatch有什么好处,mongodb,mongodb-query,Mongodb,Mongodb Query,学问 在第二周的数组操作符下的章节中,这里是票房数组: boxOffice: [{ "country": "USA", "revenue": 41.3 }, { "country": "Australia", "revenue": 2.9 }, { "country": "UK", "revenue": 10.1 }, { "country": "Germany", "revenue": 4.3 }, { "country"

学问

在第二周的数组操作符下的章节中,这里是
票房
数组:

boxOffice: [{
    "country": "USA",
    "revenue": 41.3
}, {
    "country": "Australia",
    "revenue": 2.9
}, {
    "country": "UK",
    "revenue": 10.1
}, {
    "country": "Germany",
    "revenue": 4.3
}, {
    "country": "France",
    "revenue": 3.5
}]
以下是英国获得超过15%收入的查询

这里的混乱之处在于,查询过滤器在MongoDB的find查询中默认为,它应该返回满足
国家要求的文档:“UK”
收入:{$gt:15}
,并带有以下查询:

db.movieDetails.find({
    boxOffice: {
        country: "UK",
        revenue: {
            $gt: 15
        }
    }
})
一位专家说,这是错误的方式

当默认情况下查找筛选器是时,
$elemMatch
有什么好处


您的第二个示例,它的表述方式不是搜索包含国家:“UK”和收入大于15的boxOffice数组的文档。相反,它将寻找与您为boxOffice提供的内容完全匹配的内容,我认为这不是您想要的。换句话说,它将搜索boxOffice等于以下值的文档:

{
    country: "UK",
    revenue: {
        $gt: 15
    }
}
(顺便说一句,这样的文档不能存在于您的集合中,因为您不能以$开头字段名。)

相反,您可以这样表述该查询:

{
    "boxOffice.country": "UK",
    "boxOffice.revenue": {
        $gt: 15
    }
}
这里的问题是,它不要求两个条件都包含在同一个数组元素中。因此,它将与您的示例文档相匹配

{
    boxOffice: [{
        "country": "USA",
        "revenue": 41.3
    }, {
        "country": "Australia",
        "revenue": 2.9
    }, {
        "country": "UK",
        "revenue": 10.1
    }, {
        "country": "Germany",
        "revenue": 4.3
    }, {
        "country": "France",
        "revenue": 3.5
    }]
}
尽管没有单一的数组元素与国家:“英国”和收入超过15


这就是$elemMatch的用武之地。它允许您要求同一数组元素同时满足两个(或多个)条件。因此,它只会返回英国票房超过15的文档(我想是代表电影的文档)。

第二个例子,它的表述方式不会搜索包含国家:“英国”和收入超过15的boxOffice数组的文档。相反,它将寻找与您为boxOffice提供的内容完全匹配的内容,我认为这不是您想要的。换句话说,它将搜索boxOffice等于以下值的文档:

{
    country: "UK",
    revenue: {
        $gt: 15
    }
}
(顺便说一句,这样的文档不能存在于您的集合中,因为您不能以$开头字段名。)

相反,您可以这样表述该查询:

{
    "boxOffice.country": "UK",
    "boxOffice.revenue": {
        $gt: 15
    }
}
这里的问题是,它不要求两个条件都包含在同一个数组元素中。因此,它将与您的示例文档相匹配

{
    boxOffice: [{
        "country": "USA",
        "revenue": 41.3
    }, {
        "country": "Australia",
        "revenue": 2.9
    }, {
        "country": "UK",
        "revenue": 10.1
    }, {
        "country": "Germany",
        "revenue": 4.3
    }, {
        "country": "France",
        "revenue": 3.5
    }]
}
即使没有国家为“UK”且收入大于15的单个数组元素

这就是$elemMatch的用武之地。它允许您要求同一数组元素同时满足两个(或多个)条件。所以它只会返回英国票房超过15美元的文件(我想是代表电影的)