MongDB查询
转载请出自出处:http://eksliang.iteye.com/blog/2174452
一、find简介
MongoDB中使用find来进行查询。
API:如下
function ( query , fields , limit , skip, batchSize, options ){.....}
参数含义:
- query:查询参数
- fields:查询返回的列
- limit:返回结果上限 --可以利用它进行分页
- skip: 跳过多少个元素 --可以利用它进行分页
二.查询的限制
MongoDB在查询上面有些限制,传递给数据库的查询文档的值必须是常量。其实说白了就是不能引用文档中其他键的值。
例如库存表中有“in_stock”(剩余库存)和“num_sold”(已经售出)两个键,要想通过下列查询来比较两者是行不通的。
db.stock.find({"in_stock":this.num_sold}) //这样写是行不通的
三、MongoDB对AND、OR、IN的操作
参考实例一:AND操作
在MongoDB中向查询文档中加入多个键值对,将多个查询条件组合在一起,这样的条件会被解释成AND操作。例如,要想查询用户名为ickes而且年龄为25岁的用户。查询语句如下:
> db.users.find({"name":"ickes","age":25})
参考实例二:OR查询
例如:查询用户名为user1 或者 age为24的用户。查询语句如下:
db.users.find({"$or":[{"name":"user1"},{"age":24}]})
参考实例三:IN和NOT IN操作
其实说白了IN就是对单个字段的OR的一种简写。
例1:查询年龄等于16、24、32的用户。查询语句如下:
db.users.find({"age":{"$in":[16,24,32]}})
例2:查询年龄不等于13、17、21的用户。查询语句如下:
> db.users.find({"age":{"$nin":[13,17,21]}})
四.查询条件(>、>=、<、<=、!=)
在MongoDB中“$lt”、“$lte”、“$gt”、“$gte”分别代表比较操作符 <、<=、>、>=
参考实例一:查询年龄在18~30直接的用户
db.users.find({"age":{"$gt":18,"$lt":30}})
范围查询对日期最重要了。
参考实例二:查询用户的创建时间在2012年之前注册的用户
> createDate = new Date("2012-01-01")
> db.users.find({"create":{"$gte":createDate}})
参考实例三:不等于(!=),使用条件操作符"$ne"。
查询用户名不等于ickes的所有用户
> db.users.find({"name":{"$ne":"ickes"}})
五、MongoDB查询时对null的处理
null类型的行为确实有点奇怪。因为MongoDB对于键不存在和对{"key":null}的处理是一样的,所以要是有一个包含如下文档的集合。
> db.dept.find()
{ "_id" : 1, "name" : "东环应用1", "y" : null }
{ "_id" : 2, "name" : "东环应用2", "y" : "" }
{ "_id" : 3, "name" : "东环应用3" }
执行{"y":null}如下语句会发现把{ "_id" : 3, "name" : "东环应用3" }的文档也查询出来,例如:
> db.dept.find({"y":null})
{ "_id" : 1, "name" : "东环应用1", "y" : null }
{ "_id" : 3, "name" : "东环应用3" }
遇到这种情况,就得使用"$exists"用来判断键是否存在,单独使用"$exists"如下所示:
> db.dept.find({"y":{"$exists":true}})
{ "_id" : 1, "name" : "东环应用1", "y" : null }
{ "_id" : 2, "name" : "东环应用2", "y" : "" }
查询{"y":null}的文档参考实例如下:
> db.dept.find({"y":{"$in":[null],"$exists":true}})
{ "_id" : 1, "name" : "东环应用1", "y" : null }
记住这种特殊的写法,不是{"y":{"$exists":true},"y":null},这种写法行不通
六、MongoDB对于模糊查询的使用
首先需要明确一个概念,那就是MongoDB没有数据库的那种like查询,mongodb虽然没有like但是他的功能比关系型数据库的like更为强大,因为他使用的是正则表达式,这种处理字符串的神器。
参考实例一:查看部门名称为xl的部门(不区分大小写)
> db.dept.find({"name":/xl/i}) --这里的后缀i就是不区分大小写的标识
{ "_id" : 3, "name" : "XL" }
{ "_id" : 4, "name" : "xl" }
参考实例二:查看以ickes开头的部门
> db.dept.find({"name":/^ickes/})
{ "_id" : 1, "name" : "ickes1" }
{ "_id" : 2, "name" : "ickes2" }
参考实例三:查看以部门名称以1结尾的部门
> db.dept.find({"name":/1$/})
{ "_id" : 1, "name" : "ickes1" }
参考实例四:查看包含部门名称中包含"ck"的部门
> db.dept.find({"name":/.*ck.*/})
{ "_id" : 1, "name" : "ickes1" }
{ "_id" : 2, "name" : "ickes2" }
MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式,任何PCRE支持的正则表达式语法MongoDB都能接受