find(参数1,参数2)
参数1:需要返回的文档
参数2:指定想要的键
//查询users表中age为27的文档 db.users.find({'age' : 27}) //查询users表中username为joe的文档 db.users.find({'username':'joe'}) //可以使用多条件查询,会解释成条件1 AND 条件2 AND...AND 条件N //例如查询username为joe且age为27的用户 db.users.find({'username' : 'joe', 'age': 27})
//提取users表中的username和email键,默认会返回_id键,所以我们在第二个参数中将其设置为0,就不会提取了。 db.users.find({},{'username' : 1, 'email' : 1, '_id' : 0})
替代符 | $lt | $lte | $gt | $gte | $ne |
对应关系 | < | <= | > | >= | != |
//查询年龄在18~30(含)之间的用户 db.users.find({'age' : {$gte : 18, $lte : 30}}) //查询不是joe的用户 db.users.find({'username': {$ne : 'joe'}})
$in可以用来查询一个键的多个值
$or用来完成多个键值的任意给定值
//对于单一键要是有多个值与其匹配的话,就要使用$in加一个条件数组 //例如中奖号码为725,542和390 db.raffle.find({'ticket_no' : { $in : [] }}) //与$in相对应的方法是$nin db.raffle.find({'ticket_no' : { $nin : [725, 542, 390] }}) //$or的使用 db.raffle.find({'$or' : [{'ticket_no' :725},{'winner' : true}]}) //两者结合使用 db.raffle.find({'$or' : [{'ticket_no' :{ $in : [725, 542, 390]}},{'winner' : true}]})
$not是元条件句,可以在任何其他条件之上
//$mod为取模运算符,$mod会将查询的值除以第一个给定的值,若余数等于第二个给定值则会返回该结果 db.users.find({'id_num' : {$mod : [5, 1]}}) //上面会返回id_num为1,6,11,16.... //但是想要放回2,3,4,5,7,8...就要使用$not了 db.users.find({'id_num' : {$not : {$mod : [5, 1]}}})
//例如查询Joe或joe或者JOe db.users.find({'username' : /joe/i})
//首先建立food表,并插入一个文档 db.food.insert({'fruit':['apple', 'banana', 'peach']}) //下面的查询会返回该文档 db.food.find({'fruit' : 'banana'})
$all
如果需要多个元素来匹配数组,就需要使用$all了
//假设在我们表中3个下面的文档 db.food.insert({'_id' : 1,'fruit' : ['apple', 'banana', 'peach']}) db.food.insert({'_id' : 2,'fruit' : ['apple', 'kumquat', 'orange']}) db.food.insert({'_id' : 3,'fruit' : ['cherry', 'banana', 'apple']}) //要找到既有apple又有banana的文档,就要用到$all了 db.food.find({'fruit' : {$all : ['apple', 'banana']}}) //如果需要查询指定位置的元素,就需要使用key.index语法指定下标了 db.food.find({'fruit.2' : 'peach'}) //数组下标都是从0开始的,所以它会匹配到_id为1的文档
$size
对于查询数组来说意义非凡,可以用其来查询指定长度的数组。
//指定需要查询数组的长度 db.food.find({'fruit' : {$size : 3}}) //如果需要一个长度范围,需要一些技巧 //因为$siez查询不支持$gt,$gte等条件语句 //但是我们可以给每个文档增加一个size键,这样就可以方便我们查询了 db.food.insert({'_id' : 1,'fruit' : ['apple', 'banana', 'peach'],'size' : 3}) //当我们需要添加水果时 db.food.update({'_id' : 1},{$push : {'fruit' : 'strawberry',$inc:{'size' : 1}}}) //之后我们就可以使用下面这样子的查询了 db.food.find({'size' : {$gt : 3}})
$slice操作符
$slice返回数组的一个子集合
//返回一个博客文档的前10条评论 db.posts.findOne({'_id' : 1}, {'comments' : {$slice : 10}}) //返回一个博客文档的后10条评论 db.posts.findOne({'_id' : 1}, {'comments' : {$slice : -10}}) //也接受便宜值和要返回的数量 //返回一个博客文档的从第24条评论开始的10条评论 db.posts.findOne({'_id' : 1}, {'comments' : {$slice : [23, 10]}})
可以查询整个文档或者针对键值进行查询
//假如有以下文档 { 'name' : { 'first' : 'Joe', 'last' : 'Schmoe' } 'age' : 45 } //要查询姓名是Joe Schmoe的人可以这样 db.users.find({'name.fisrt':'Joe','name.last':'Schmoe'})
//假设我们的表food有两个文档如下 /* 0 */ { "_id" : ObjectId("52dd1effaad1ad6d22d62a33"), "apple" : 4, "banana" : 4 } /* 1 */ { "_id" : ObjectId("52dd2157aad1ad6d22d62a34"), "apple" : 5, "banana" : 6 } //我们要查询其中的apple和banana相等的文档 //函数中的this代表着将要返回的文档 db.food.find({ $where : function () { if(this.apple && this.banana && this.apple == this.banana) { return true } else { return false }}})
这样子查询性能不高,一般不建议使用,但是如果确实是没有好的方法也可以使用,查询的结果非常直观!