MongoDB中使用find来进行查询。查询就是返回一个集合中文档的子集,子集得范围从0个文档到整个集合。find得第一个参数决定要返回哪些文档,这个参数是一个文档,用于指定查询条件。正则表达式
空得查询文档{}默认返回所有内容。 如:db.blog.find() 或者db.blog.find({"name":"zhangsan","age":20})shell
有时候并不须要将文档中全部的键/值对都返回。咱们能够经过设置第二个参数来指定想要的键,这样会介绍传输的数据量,又能节省客户端解析文档的时间和内存消耗。
数据库
如:db.blog.find({},{"username":1,"email":1})
数组
默认状况下,“_id”这个键老是被返回的。安全
也可使用第二个参数来剔除查询结果中得某些键值对。如 db.blog.find({},{"delFlag":0})
服务器
查询时候有些限制,传递给数据库的查询文档的值必须是常量,不能是阴影文档中其余键的值。ui
"$lt","$lte","$gt","$gte"等价于"<","<=",">",">=",是比较操做符。咱们能够将操做符组合起来使用。
spa
如:查询10-20岁的用户 code
db.user.find({"age"{"$gte":10,"$lte":20}})
查询2015年10月1日前注册的用户
对象
start = new Date("01/10/2015") db.user.find({"registeDate":{"$lt":start}})
对于文档中键值不等于某个特定值得状况,就要使用另一个条件操做符“$ne”,表示不相等。
查询用户名字不是“liming”的人。
db.user.find({"name":{"$ne":"liming"}})
MongoDB中有2中方式进行or查询:“$in”能够用来查询一个键得多个值;“$or”能够在多个键中查询任意给定值。
一个键匹配多个值。
db.user.find({"no":{"$in":[1,23,55,66,78]}})
返回与数组中全部条件都不匹配的文档,使用“$nin”
db.user.find({"no":{"$nin":[1,23,55,66,78]}})
"$or"能够接受一个包含可能条件的数组做为参数
db.user.find({"or":[{"no":12},{"age":20}]})
db.user.find({"or":[{"no":{"$in":[1,2,3,4]}},{"age":20}]})
"$not"是元条件句,能够用在任何其余条件之上。
如取模运算符“$mod”,将会查询的值除以第一个给定值,若余数等于第二个给定值则匹配成功。
db.user.find({"no"{"$mod":[5,1]}})
返回结果是no的值是1,6,11,16等。若是要返回2,3,45,等用户就要使用$not
db.user.find({"no"{"$not":{"$mod":[5,1]}}})
对比前面更新修改器和查询文档,咱们会发现以“$”开头的键位于在不一样的位置。再查询中“$lt”再内层文档,更新中'$inc"则在外层文档。
一个键能够有任意多个条件,可是一个键不能对应多个更新修改器。
一些“元操做符”也位于外层文档,如“$and”、“$or”、“$nor”
db.user.find({"$and":[{"x":{"$lt":1}},{"x"4}]})
db.user.find({"name":null})
若是文档中存在name键为null得文档,则会列出该文档。若是不存在,则列出缺乏这个键的全部文档。
正则表达式可以灵活有效地匹配字符串。
若是须要经过多个元素来匹配数组,就要用 "$all"。
db.food.find({"fruit":{"$all":["a","b"]}})
若是想要查询数组特定位置的元素,须要使用key.index语法指定下标。
db.food.find({"fruit.2":"a"})
数组下标都是从0开始,因此上面的表达式会翻红数组第3个元素和“a”进行匹配。
用来查询特定长度的数组
db.food.find({"fruit":{"$siez":3}})
该操做符能够返回某个键匹配的数组元素的一个子元素。
如:须要返回博客前面10条评论
db.blog.findOne({},{"comments":{"$slice":10}})
须要返回博客后面10条评论
db.blog.findOne({},{"comments":{"$slice":-10}})
也能够指定偏移值以及但愿返回的元素数量,来返回元素集合中间位置的某些结果
db.blog.findOne({},{"comments":{"$slice":[30,10]}})
2种方法:查询整个文档或者只针对其键值对进行查询。
使用$where能够在查询中执行任意的js。这样就能够在查询中几乎任何事情,为了安全,应该严格限制或是消除$where语句的使用。
$where查询在速度上要比常规的查询慢,每一个文档都有从BSON转换成js对象,而后经过$where表达式来运行,且$where语句不能使用索引。
数据库使用游标返回find得执行结果,客户端对游标得实现一般可以对最终结果进行有效控制。
执行查询,分配一个局部变量
var cursor = db.collection.find();
若是没有把结果放在全局变量或者变量中,MongoDB shell回自动迭代,自动显示若干文档。
要迭代结果,可使用游标得next方法,也可使用hasNext来查看游标中是否还有其余结果。
while(cursor.hasNext()){ obj = cursor.next(); }
游标还实现了js得迭代器接口,咱们也可使用forEach再循环中使用。
cursor.forEach(function(x){ print(x.x); })
调用find时,shell并不当即查询数据库,而是等待真正开始要求得到结果时才发送查询,这样再执行查询前能够给查询附加额外的选项。几乎游标对象的美俄方法都返回游标自己,这样就能够按任意顺序组成方法链。
再这以前都是构造查询。执行cursor.hasNext(),查询被发到服务器。shell马上获取前面100个结果或者4MB数据,这样下次调用net或者hasNet就不用再链接服务器取结果,客户端用完第一组结果,shell才会再次联系数据库,使用getMore请求提取更多结果,若是有则返回下一批结果,这个过程会一直持续直到游标耗尽或者取彻底部结果。
最经常使用得查询选项就是限制返回结果的数量、忽略必定数量的结果以及排序。这些选项要在查询被发送到服务器以前指定。
限定结果数量,只返回10个结果
db.user.find().limit(10)
略过结果,忽略前面5个匹配的文档,返回剩下的文档
db.user.find().skip(5)
sort接受一个对象做为参数,这个对象是一组键值对,键对应文档的键名,值表明排序方向,1表明升序,-1表明降序,若是指定多个键则安装指定顺序逐个排列。
db.user.find().sort({"userName":1,"age":-1})
能够组合使用,针对分页效果大大的好
如搜索MP3,每页返回50个记录,价格按照高到低排序
db.shop.find({"name":"mp3"}).limit(50).sort({"price":-1})
下一页查看更多
db.shop.find({"name":"mp3"}).limit(50).skip(50).sort({"price":-1})
到时候再开一篇写
在服务端,游标消耗内存和其余资源。游标遍历尽告终果之后,或者客户端发来消息要终止,数据库将会释放这些资源。释放的资源会被数据库另用,因此要保证尽快释放游标。
特殊状况游标终止,随后会被自动清理。
游标完成匹配结果迭代,会清除自身。
客户端游标不在做用域,驱动程序会向服务端发送特别消息让其销毁。
游标10分钟内没有使用也会自动销毁。