$match
用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
示例
现有集合 articles 文档内容如下:
db.articles.insert([
{ "_id" : 1, "author" : "dave", "score" : 80, "views" : 100 },
{ "_id" : 2, "author" : "dave", "score" : 85, "views" : 521 },
{ "_id" : 3, "author" : "ahn", "score" : 60, "views" : 1000 },
{ "_id" : 4, "author" : "li", "score" : 55, "views" : 5000 },
{ "_id" : 5, "author" : "annT", "score" : 60, "views" : 50 },
{ "_id" : 6, "author" : "li", "score" : 94, "views" : 999 },
{ "_id" : 7, "author" : "ty", "score" : 95, "views" : 1000 }
])
Match 匹配
利用 $match 执行匹配操作,如下:
db.articles.aggregate([
{ $match : { author : "dave" } }
]
)
输出:
{ "_id" : 1, "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : 2, "author" : "dave", "score" : 85, "views" : 521 }
范围条件匹配
统计 articles 集合中 score在70~90中间,或者views大于等于1000
回想一下如果用 find() 如何查询?
db.articles.find(
{
$or: [
{
score: {
$gt: 70
},
score:{
$lt: 90
}
},
{
views: {
$gte: 1000
}
}
]
}
)
执行输出:
{ "_id" : 1, "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : 2, "author" : "dave", "score" : 85, "views" : 521 }
{ "_id" : 3, "author" : "ahn", "score" : 60, "views" : 1000 }
{ "_id" : 4, "author" : "li", "score" : 55, "views" : 5000 }
{ "_id" : 5, "author" : "annT", "score" : 60, "views" : 50 }
{ "_id" : 7, "author" : "ty", "score" : 95, "views" : 1000 }
可以看到{ "_id" : 5, "author" : "annT", "score" : 60, "views" : 50 }
这个结果是不对的,为什么???
同一个score键,后者覆盖前者
db.articles.find(
{
$or: [
{
score: {
$gt: 70,
$lt: 90
}
},
{
views: {
$gte: 1000
}
}
]
}
)
聚合match写法
db.articles.aggregate([
{
$match: {
$or: [
{
score: {
$gt: 70,
$lt: 90
}
},
{
views: {
$gte: 1000
}
}
]
}
}
])
计算Count值
统计 articles 集合中 score在70~90中间,或者views大于等于1000 个数
db.articles.count(
{
$or: [
{
score: {
$gt: 70,
$lt: 90
}
},
{
views: {
$gte: 1000
}
}
]
}
)
那如果使用聚合aggregate 如何来实现呢?
db.articles.aggregate(
[
{
$match: {
$or: [
{
score: {
$gt: 70,
$lt: 90
}
},
{
views: {
$gte: 1000
}
}
]
}
},
{
$group: {
_id: null,
count: {
$sum: 1
}
}
}
]
)
输出:
{ "_id" : null, "count" : 5 }
类似于SQL语句: select count(*) from articles where (score>70 and score<90) or views>=1000