九:文档 Document 查询基础篇

一灰灰blogDBMongoMongoDb约 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...