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美元的文件(我想是代表电影的)