乐趣区

MongoDB 高级查询

参考官方文档(图文并茂非常好看):Getting Started – MongoDB Documentation
MongoDB 的查询功能非常强大,同时有些地方也会有点复杂。所以需要下点功夫学习和操练才能用好。
关于 Mongo Shell
当我们进入 Mongo Shell 客户端后,实际上是进入了一个 Javascript 语言的交互环境。也就是说,MongoDB 中的很多命令,尤其是包括定义函数等高级命令,实际上都是 Javascript 语言,甚至说可以是 jQuery。了解了这点,一些高级命令如 Aggregation 学起来就会放松很多。
官方说明:
基本查询功能
比较运算

: 等于

$lt: Less Than

$gt: Greater Than

$gte: Greater Than or Equal

$ne: Not Equal

# age 大于等于 18
db.mycollection1.find({ age:{$gt: 18} } )
逻辑运算

$and
$or

db.mycollection1.find({
$or: [
{age: {$gte: 20} },
{salary: {$gt: 5000} },
{job: “HR”}
]
} )
范围运算

$in

$nin: Not In

db.mycollection1.find({
age: {
$in: [10, 20, 30]
}
} )
正则表达式
有两种方法:

/ 表达式内容 /
{$regex: “ 表达式内容 ”}

db.mycollection1.find({
name: /^Ja\w+$/
} )

# 或
db.mycollection1.find({
name: {
$regex: “/^Jaso\w?$”
}
} )
limit 和 skip
# 限定显示条数
db.mycollection1.find().limit( 数量)

# 跳过指定第几条数据
db.mycollection1.find().skip(2)

# 混合使用
db.mycollection1.find().limit(10).skip(3)
自定义函数查询
自定义查询是指使用自定义函数,格式为 $where: function(){…}
db.mycollection1.find({
$where: function() {
return this.age >= 18;
}
} )
投影
即搜索的返回值中,只显示指定的某些字段。字段指为 0 的不现实,指为 1 的显示,默认为 1。
# 格式为:
db.mycollection1.find(
{查询条件},
{显示与否的选项}
)

# 如:
db.mycollection1.find(
{},
{_id: 0, name: 1, age: 1}
)
排序
可以按指定的某些字段排序,字段标记为 1 的为 Asc 升序,标记为 - 1 的为 Desc 降序。
db.mycollection1.find().sort({ name:1, age:-1})
统计
使用 count() 函数。
db.mycollection1.find().count()

db.mycollection1.count({ 查询条件} )
消除重复
使用 distinct() 函数。
# 格式为:
db. 集合名.distinct(“ 指定字段 ”, { 查询条件} )

# 如
db.mycollection1.distinct(
“job”,
{age: {$lt: 40} }
)
聚合管道 Aggregation
Aggregation 是 MongoDB 特有的一种 Pipline 管道型、聚合查询方式。语法稍微复杂一些。
聚合管道可以达到多步骤的分组、筛选功能。这个管道中的每一个步骤,成为一个 stage。

常用的管道有:

$match:简单的根据条件过滤筛选

$group:将数据分组,一般配合一些统计函数,如 $sum。

$project:修改 document 的结构。如增删改,或创建计算结果

$lookup:

$unwind:将 List 列表类型的 Document 进行拆分
$sort
$limit
$skip

语法格式为:
db. 集合名.aggregate([
{管道表达式 1},
{管道表达式 2},
{管道表达式 2}
] )
示例:
db.Orders.aggregate([
{$match: {
status: “A”
} },
{$group: {
_id: “$cut_id”,
total: {$sum: “$amount”}
} }
] )

管道的 Map Reduce

退出移动版