在CRUD四个操作中查找是从mongodb数据库的集合中获取一个记录或者一个文档。对于非DBA来说,使用的最多的就是查询,所以说如果学好了查询,对于我们将来更好的操作数据库有很大的帮助。
在mongodb中从集合中获得一条数据或者文档可以通过以下两个方法:
find()
findOne()
find()是我们从数据库中查找数据使用最主要的方法。find()语法如下:
db.[集合名].find(
类比SQL语句,query就相当于我们SQL中的查询条件,projection就相当于SQL中SELECT后面我们需要的字段。默认情况下find()最多返回20条记录。
在前面我们介绍了如果我们省略query、projection参数默认会返回集合中的文档。
下面我们查询一下user集合中name为user2的文档:
> db.user.find()
{ "_id" : 1, "name" : "user1","age" : 11 }
{ "_id" : 2, "name" : "user2", "age": 12 }
{ "_id" : 3, "name" : "user3","age" : 13 }
{ "_id" : 4, "name" : "user4","age" : 14 }
{ "_id" : 5, "name" : "user5","age" : 15 }
{ "_id" : 6, "name" : "user6","age" : 16 }
{ "_id" : 7, "name" : "user7","age" : 17 }
{ "_id" : 8, "name" : "user8","age" : 18 }
{ "_id" : 9, "name" : "user9","age" : 19 }
{ "_id" : 10, "name" : "user10","age" : 20 }
> db.user.find({name:"user2"}) /*我们只是用了query参数,默认返回所有字段,类似SQL中的SELECT * from table*/
{ "_id" : 2, "name" : "user2","age" : 12 }
上面的代码中将文档的所有字段都返回了,可能这个文档小无所谓。如果对于一个很大的文档,我们只需要一个字段,如果再这样返回,那么我们就有点浪费了,这时候我们就可以使用projection参数。
我们自user表中查找name为user2的文档,我们只想知道它的age,不需要它的name,我们可以向下面这样:
> db.user.find({name:"user2"},{age:1})
{ "_id" : 2, "age" : 12 }
在mongodb中,对于非零都会认为为真,只有0会被当做假,所以像上面的情况中使用true和false也可。包括自后面的代码中,我也会经常使用非0数代表真。
可能我们有人希望按照下面那样写projection参数:
{name:0,age:1}
这样再mongodb中错误的,mongodb中projection参数,要不就只写你需要的值(也就是值都为真),要不你就都写不想要的值(值都为假),混合使用是不被接受的。
findOne()与find()基本相同,只是findONe()不管满足查询条件的文档有多少,只会返回第一条数据。findOne()的语法和使用方法与find()一样,这里就不再介绍了。
4.2.1 查询选择器
如果mongodb只是提供了上面介绍的查询方式,那么mongodb号称强大的查询功能就太名不副实了。下面我们就来学习mongodb强大的查询选择器。
在mongodb的文档中将其分为比较、逻辑、元素、java script、地理空间、数据选择器,我们也按照这个介绍。
比较选择器
Mongodb提供的比较选择器有$all、$gt、$gte、$lt、$lte、$in、$nin、$ne。
$all
语法:{ field: {$all: [
查找字段的值为数组,并且包含所有给定的值的文档。
> db.phone.find()
{ "_id" : ObjectId("5198e20220c9b0dc40419385"),"num" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("5198e21820c9b0dc40419386"),"num" : [ 4, 2, 3 ] }
{ "_id" : ObjectId("5198e22120c9b0dc40419387"),"num" : [ 1, 2, 5 ] }
> db.phone.find({num:{$all:[1,4]}}) /*同时包含1,4的没有数据*/
> db.phone.find({num:{$all:[1,2]}})
{ "_id" : ObjectId("5198e20220c9b0dc40419385"),"num" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("5198e22120c9b0dc40419387"),"num" : [ 1, 2, 5 ] }
$gt
语法:{field: {$gt:value} }
查找字段的值大于给定值的文档。
> db.user.find({age:{$gt:6}})
{ "_id" : ObjectId("5198c286c686eb50e2c843b9"),"name" : "user7", "age" : 7 }
{ "_id" : ObjectId("5198c286c686eb50e2c843ba"),"name" : "user8", "age" : 8 }
{ "_id" : ObjectId("5198c286c686eb50e2c843bb"),"name" : "user9", "age" : 9 }
{ "_id" : ObjectId("5198c286c686eb50e2c843bc"),"name" : "user10", "age" : 10 }
{ "_id" : ObjectId("5198c3cac686eb50e2c843bd"),"name" : "user0", "age" : 20 }
$gte
语法:{field:{$gte: value} }
查找字段的值大于等于给定值的文档。
> db.user.find({age:{$gt:6}})
{ "_id" : ObjectId("5198c286c686eb50e2c843b8"),"name" : "user6", "age" : 6 }
{ "_id" : ObjectId("5198c286c686eb50e2c843b9"),"name" : "user7", "age" : 7 }
{ "_id" : ObjectId("5198c286c686eb50e2c843ba"),"name" : "user8", "age" : 8 }
{ "_id" : ObjectId("5198c286c686eb50e2c843bb"),"name" : "user9", "age" : 9 }
{ "_id" : ObjectId("5198c286c686eb50e2c843bc"),"name" : "user10", "age" : 10 }
{ "_id" : ObjectId("5198c3cac686eb50e2c843bd"),"name" : "user0", "age" : 20 }
$lt
语法:{field: {$lt:value} }
查找字段的值小于给定值的文档。
> db.user.find()
{ "_id" : 1, "name" : "user1","age" : 1 }
{