👐 $match
$match 操作符与聚合框架一起使用,用于过滤集合中的文档。它接受一个文档作为输入,并返回一个新文档,仅包含符合指定条件的文档。$match 操作符的语法如下:
{ $match: { <expression>: <value> } }
表达式
$match 操作符中的 <expression>
部分可以是任何有效的 MongoDB 表达式。这包括:
- 比较操作符:
eq
、neq
、gte
、lte
、gt
、lt
、in
、nin
、exists
- 正则表达式:
regex
- 逻辑操作符:
and
、or
、not
- 子文档和数组:
{ field: <value> }, [ <item>, <item>, ... ]
匹配书籍文档
- Atlas UI
- MongoDB Shell
首先,确保在 Atlas UI 中选择 books
集合。
然后,导航到 Aggregation
选项卡并点击 Add Stage
。
假设我们想要所有 2010 年的书籍。我们可以添加一个 $match
阶段来过滤 books 集合中的文档:
[
{
$match: { year: 2010 }
}
]
假设我们想要所有 2010 年的书籍。我们会写:
db.books.aggregate([{$match: {year: 2010}}])
👐 返回所有有恰好 100 页的 books
。
答案
- Atlas UI
- MongoDB Shell
[
{
$match: { pages: 100 }
}
]
db.books.aggregate([{$match: {pages: 100}}])
AND
如果我们需要使用 AND 添加更多条件,可以使用 $and
操作符。
如果我们想要所有有 100 页并且 totalInventory
恰好为 2 的书籍,我们可以使用 $and
操作符。这个操作符接受一个包含所有条件的文档数组,这些条件都必须为真,AND 操作才会成功:
- Atlas UI
- MongoDB Shell
[
{
$match: {
$and: [
{ pages: 100 },
{ totalInventory: 2 }
]
}
}
]
db.books.aggregate([{$match: {$and: [{pages: 100}, {totalInventory: 2}]}}])
伪代码如下:
IF pages == 100 AND totalInventory == 2 {
return matching docs
}
👐 返回所有 2015 年的 books
,这些书籍恰好有 100 页。
答案
- Atlas UI
- MongoDB Shell
[
{
$match: {
$and: [
{ pages: 100 },
{ year: 2015 }
]
}
}
]
db.books.aggregate([{$match: {$and: [{pages: 100}, {year: 2015}]}}])
👐 它们有多少?
答案
- Atlas UI
- MongoDB Shell
[
{
$match: {
$and: [
{ pages: 100 },
{ year: 2015 }
]
}
},
{
$count: "books_count"
}
]
db.books.aggregate([{$match: {$and: [{pages: 100}, {year: 2015}]}}]).itcount()
简写 AND
我们可以通过传递包含所有条件的文档来进行隐式 AND(而不是文档数组):
- Atlas UI
- MongoDB Shell
[
{
$match: {pages: 100, totalInventory: 2}
}
]
db.books.aggregate([{$match: {pages: 100, totalInventory: 2}}])
👐 使用简单的 $and 语法返回所有 2015 年的 books
,这些书籍恰好有 100 页
答案
- Atlas UI
- MongoDB Shell
[
{
$match: {pages: 100, year: 2015}
}
]
db.books.aggregate([{$match: {pages: 100, year: 2015}}])