xam*_*mir 1 mongodb mongodb-query
在第二周的数组运算符章节中,数组如下boxOffice:
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
}]
Run Code Online (Sandbox Code Playgroud)
以下是获取英国收入大于 15的查询
db.movieDetails.find({
boxOffice: {
$elemMatch: {
country: "UK",
revenue: {
$gt: 15
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
这里的困惑在于,查询过滤器默认在 MongoDB 的查找查询中进行AND编辑,这应该返回满足以下查询的country: "UK" AND revenue: { $gt: 15 }要求的文档:
db.movieDetails.find({
boxOffice: {
country: "UK",
revenue: {
$gt: 15
}
}
})
Run Code Online (Sandbox Code Playgroud)
一位专家表示,这是错误的做法。
$elemMatch当查找过滤器默认为AND时有什么好处?
你的第二个例子,它的制定方式不会搜索包含国家/地区“UK”且收入大于 15 的 boxOffice 数组的文档。相反,它将查找与你为 boxOffice 提供的内容完全匹配的内容,其中我不认为这是你的意图。换句话说,它将搜索 boxOffice 等于的文档:
{
country: "UK",
revenue: {
$gt: 15
}
}
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,这样的文档不可能存在于您的集合中,因为您不能以 $ 开头字段名称。)
相反,您可以像这样制定该查询:
{
"boxOffice.country": "UK",
"boxOffice.revenue": {
$gt: 15
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是它不要求两个条件都包含在同一个数组元素中。所以它会匹配你的示例文档
{
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
}]
}
Run Code Online (Sandbox Code Playgroud)
即使没有单个数组元素的国家/地区:“UK”且收入大于 15。
这就是$elemMatch 的用武之地。它允许您要求同一个数组元素满足两个(或多个)条件。因此,它只会返回英国票房大于 15 的文档(我猜是代表电影)。
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |