Mongodb(五):Mongodb的增删改查(3)----查询详解(上)
MongoBD的查询说白了就是一个find()方法。But 还是有点小复杂。来吧
(1) 查询所有的数据:db.集合名.find(); 这没啥说的。
(2) 查询第一条数据:db.集合名.findOne(); 也没啥说的。
(3) 条件查询:db.集合名.find(查询条件),查询条件也是一种json格式的东东。所以理解json对于学Mongodb真的很重要。
如下:查询name为zhangsan的记录:
(4) 组合条件查询:db.collection名.find({查询条件1,查询条件2,...}), 还是上面那个例子,现在假设要查询name为zhangsan,
age为23: db.customer.find({"name":"zhangsan", "age":23})
(5) 返回指定的字段:比如在关系型数据库中 select * ...是返回所有字段,select 字段1, 字段2....是返回两个字段,那么在Mong
odb中怎样做到返回指定的字段呢? 格式:db.collection名.find({查询条件1,查询条件2,...},{字段1:1, 字段2:1,....}),
其中1代表显示,如果是0就是不显示。默认是全部显示的。如果不想显示_id,必须显示的将 _id的是否显示置为0,如下:
(6) 范围查询:先看看比较操作符吧。$lt(<) , $gt(>), $lte(<=), $gte(>=), $ne(!=). 实例如下:
(7) $in查询:查询值在指定的集合内进行匹配.和SQL中的 in 差不多。如下:
查询名字为zhangsan或者是lisi的用户的信息:
(8) $nin查询:对不在指定集合条件的记录进行匹配。和SQL中 not in类似,比如现在要查询name不是zhangsan或者lisi的信息:
db.customer.find({"name":{"$nin":["zhangsan", "lisi"]}})
(9) $or查询:就是 或者 的意思嘛,上示例:查询name为zhangsan 或者 age 为13的用户的信息:
db.customer.find({"$or":[{"name":"zhangsan"}, {"age":13}]}),如下所示:
再写一个稍微复杂一点的,查询_id在 001或002中, 或者name为zhaoliu的用户的信息:
db.customer.find({"$or":[{"_id":{"$in":["001", "002"]}}, {"name":"zhaoliu"}]}).如下所示:
(10)$not查询: $not和$nin的区别是$nin是只能用到集合上.$not范围广点。
查询_id不在001和002中的用户的信息:db.customer.find({"_id":{"$not":{"$in":["001", "002"]}}})
(11)null:现在collection中有如下document:
从上图可看到有些document中有sex,有些没有,有些为null, 输入如下命令:db.customer.find({"sex":null}),结果如下:
从结果可以看出,不但sex为null的查询出来了,而且没有sex字段的document也查询出来了。如果要找到age为null的,还应该在
这个基础上必须限制出现age.那怎么办呢?先放一放,说完下面这一条就出来了。
(12)$exists : 判断字段是否存在.比如,查询所有存在name字段的记录:db.customer.find({"name":{"$exists":true}}), 查
询所有的不存在sex字段的记录:db.customer.find({"sex":{"$exists":false}}). 现在解决(11)中的问题:
不过有一点觉得很奇怪:为什么不能像下面这样写?
其实仔细想想也就明白了:因为条件的写法是遵循json格式,在json中,键不能重复,当重复的时候,后者会将前者覆盖,我想大概
就是这个原因吧。
(12)正则表达式: 直接上示例:查询name中包含ang的用户的信息:db.customer.find({"name":/ang/})
查询那么以 Z 开头的用户的信息:db.customer.find({"name":/^z/})
查询以an结尾的用户的信息:db.customer.find({"name":/an$/})