当查找过滤器默认为 AND 时, $elemMatch 有什么好处

xam*_*mir 1 mongodb mongodb-query

学习Node.js 的 MongoDB

在第二周的数组运算符章节中,数组如下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时有什么好处?

Wak*_*ake 6

你的第二个例子,它的制定方式不会搜索包含国家/地区“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 的文档(我猜是代表电影)。