九:文档 Document 查询基础篇
约 876 字大约 3 分钟
MongoDb文档查询,主要借助find方法来完成,在实际的业务开发中,为了满足各种复杂的业务场景,查询的姿势也是各种各样,本篇则主要介绍基本的使用姿势,不涉及到聚合、排序、分页相关内容
1. 查询语法
查询语法定义比较简单,复杂的是查询条件的组合;语法定义如下
db.collection.find(query, projection)
- query: 查询条件,如果不填,则表示查询所有文档
- projection: 查询需要返回的field,如果不填则返回所有的数据
此外为了mongo-cli的返回结果更加友好,可以在最后添加.pretty()
,使输出更友好
2. 查询所有
db.doc_demo.find()
3. 根据条件精准查询
db.doc_demo.find({'name': '一灰灰'})
4. 数字比较查询
对于数字类型的field,可以借助符号$gt
(>), $get
(>=), $lt
(<), $lte
(<=), $ne
(!=) 来表示具体的操作
#查询age>18的文档
db.doc_demo.find({'age': {$gt: 18}})
# 查询age<20的文档
db.doc_demo.find({'age': {$lt: 20}})
5. 模糊查询
在mysql中有一个like用于模糊查询,在mongodb中,同样支持基于正则的模糊查询
# 查询name以灰灰结尾的文档
db.doc_demo.find({'name': /灰灰$/})
# 查询name中包含 lo 字符的文档
db.doc_demo.find({'name': /lo/})
# 查询name中包含l, g字符的文档
db.doc_demo.find({'name': /l.g/})
# 查询name以一灰灰开头的文档
db.doc_demo.find({'name': /^一灰灰/})
6. and条件
多个查询条件需要满足时,并不需要什么特殊的操作,只需要在查询bson中,加上多个条件即可
# 查询age > 18, 且name为 一灰灰blog的文档
db.doc_demo.find({'age': {$gt: 18}, 'name':'一灰灰blog'})
7. or条件
和and不需要额外的操作不同,or条件需要借助 $or
来实现,语法如下
db.collection.find({$or: [{queyr1, query2}]})
实例如下:
# 查询age > 18, 且name为 一灰灰blog的文档 或 age < 20 且name为一灰灰的文档
db.doc_demo.find({$or: [{'age': {$gt: 18}, 'name':'一灰灰blog'}, {'age': {$lt: 20}, 'name': '一灰灰'}]})
8. 限制返回成员
有些时候我们只需要获取文档中的部分成员,可以在第二个参数中进行指定,规则如下
成员名: 1
: 表示这个成员需要返回成员名: 0
: 表示这个成员不返回
# 表示返回的结果中,除了_id之外,其他的正常返回
db.doc_demo.find({}, {'_id': 0})
# 表示返回的结果中,除了_id之外,就只要name和age
db.doc_demo.find({}, {'name': 1, 'age': 1})
请注意,一般在使用了 成员名: 1
来指定返回field时,会自动返回_id
,如果不需要,请显示加上 _id: 0
9. field类型查询
根据field的成员类型来作为查询条件,一般有两种方式,这里只介绍更优雅的,语法如下
{field: {$type: '类型'}}
举例说明
db.doc_demo.find({'skill': {$type: 'array'}})
10. 存在查询
mongodb的一个特点就是集合的结构不固定,所以某个成员可能存在也可能不存在,所以当我们的查询条件中需要加一个是否存在的判断时,可以如下
# 查询tag存在的文档
db.doc_demo.find({'tag': {$exists:true}})
# 查询tag不存在的文档
db.doc_demo.find({'tag': null})
Loading...