MongDB查询(1)——基本查询[五]

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都能接受
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值