查询条件:
< : $lt   (小于)例如: db.mydb.user.find({age:{$lt:35}})
 <= : $lte (小于等于)     例如: db.mydb.user.find({age:{$lte:35}}) 

 >: $gt  (大于) 
 例如: db.mydb.user.find({age:{$gt:31}}) 

 >= :$gte  (大于等于)例如: db.mydb.user.find({age:{$gte:31}}) 

 ≠:$ne  (不等于)    例如: db.mydb.user.find({name:{$ne:”test3”}}) 

模糊查询:/^…/            例如: db.mydb.user.find({name:/^test/})


or查询在mongodb中有两种方式:$in($nin)与 $or:
$in: 是用来查询一个键的多个值
 例如:
 1) db.mydb.user.find({name:{$in:[“test1”,”test2”]}})
 2) db.mydb.user.find({_id:{$in:[“123”,1]}})
 与之相对的则是 $nin :用来查询条件不匹配的所有文档。$or:比$in更通用一些,是用来查询多个键的任意给定键值,其值是一个数组形式
 例如:
  db.mydb.user.find({$or:[{name:”test1”},{age:25}]}})
 $or 也可以与$in或$nin结合起来使用
  db.mydb.user.find({$or:[{name:{$in:[”test1”,”test2”]}},{age:25}]})
$not:是用来查询与特定模式不相符的文档。
 例如:
  db.mydb.user.find({age:{$not:{$mod:[5,0]}}})
 $not 与正值表达是联合使用的时候极为有用
在查询中,类似$lt的键处在内层文档,如修改器$inc则处在外层文档。
 如:{age:{$lt:30}} 与  {$inc:{age:1}}
 而且一个键可以含有多个条件,但不可以含有多个修改器:
 {age:{$lt:30,$gt:20}}  √     
 {$inc:{age:1},$set:{age:40}}  ×

Null与正值表达式:
null:可以匹配键值为null的文档,还可以匹配“不存在”的键。
 如果仅仅想要匹配键值为null的文档,既要判断该键值是否为null,还有通过“$exists”判断该键是否存在。
 例如:db.mydb.test.find({z:{$in:[null],$exist:true}})正则表达式:
例如:
 {name:/jack/} -匹配name为jack或者name为/jack/{name:/jack/i}-同上,不区分大小写


对于内嵌文档的查询有两种查询方式,一种是全文档匹配,另一种是键/值匹配,如下文档: 
 {study:”java”,person:{name:”zhangsan”,age:25}}
 采用全文档匹配查询:
  db.mydb.km.find({person:{name:”zhangsan”,age:25}})
注:精确匹配是对顺序相关的,这样的查询方式显得不是很科学!
另一种查询方式:使用.连接符的键值匹配。如下:
 db.mydb.km.find({“person.name”:”zhangsan”,”person.age”:25})
注:该查询是或查询,满足一个条件的都能被查出
复杂的内嵌文档查询
如下文档:
 {study:”java”,person:[{name:”zhangsan”,age:25},{name:”wanger”,age:27}]}
 需求:查找有没有27岁的“zhangsan”学习java这门课程的?
 误区:
 db.mydb.km.find({“person.name”:”zhangsan”,”person.age”:27}) ?
这个写法是不满足需求的,因为我们要求两个条件都满足!正确写法为:
 db.mydb.km.find({person:{$elemMatch:{name:”zhangsan”,age:27}}})
需求:查询apple和banana值相等的记录。
 普通查询是满足不了的。Mongo也没有提供这样的$关键键。只能通过$where表达式来执行:
  db.mydb.fruit.find({“$where”:function(){
       if(this.apple==this.banana) return true;
       return false;
 }}) 等价于 db.mydb.fruit.find({“$where”:”this.apple==this.banana”})

优点:可以使用javascript表达式,查询灵活、多样。
缺点:使用$where查询,比起普通的查询速度要慢的多。因为其查询原理是将被查询文档转化成javacript对象,然后通过$where表达式去比较,而且还不能使用索引。所以不到万不得已尽量避免使用$where查询。




limit :是限制返回结果集的数量,在find函数后使用该函数。
例如:db.mydb.fruit.find().limit(3) // 返回匹配到的3个文档
如果结果少于3个,则全部返回。

skip :类似于limit,区别在于返回剩下的文档:
例如:db.mydb.fruit.find().skip(3)  //略过匹配到的前3个文档,返回余下的所有文档。
如果结果少于3个,则返回空。


sort :排序函数,1 代表升序;-1 代表降序。
例如:db.mydb.fruit.find().sort({apple:1,banana:-1})
由于文档型数据库的数据类型是不规则的,但mongo预定义了数据类型的排序规则。如:{a:[1,2]} 、{a:true}

MongoDB 查询不包含 mongo查询不等于_MongoDB 查询不包含

实际开发中,三个函数组合使用的情况比较多。

例如(分页:第一页):
    db.mydb.fruit.find().limit(20).sort({apple:1})
  第二页:
    db.mydb.fruit.find().limit(20).skip(20).sort({apple:1})

在mongo中除了基本的查询find、findOne以外,还提供了很多聚合工具,跟其他关系型数据库一样,最常用到的 :count、distinct、group
count:
db.mydb.fruit.count()    ->查询文档总数
 db.mydb.fruit.count({banana:1}) ->查询限定文档总数
distinct 是键值去重。其返回值是一个数组。
 用法:
 db.mydb.fruit.distinct(“键”[,查询条件])
 如:
 db.mydb.fruit.distinct(“apple”)
 db.mydb.fruit.distinct(“apple”,{banana:1}) 

group:
用法:db.mydb.fruit.group({‘key’:{},'$reduce':function(doc,prev){},'initial':{}})  
 key:分组的键;
 initial:累加器初始值
 $reduce:分组处理函数结果返回值为文档数组:
  [{分组键,累加器}]
 例如1:
  db.mydb.fruit.db.group({key:{apple:1},$reduce:function(doc,pre){
      pre.bananaArr.push(doc.banana)
 },initial:{bananaArr:[]}})解析:按apple键分组(键值相同的分到一组),每个组中会初始化一个数组banabaArr,reduce会把迭代该组中的每一条文档doc,把banana放到该数组banabaArr中

例如2:分组后统计每个key的数量
db.mydb.fruit.db.group({key:{apple:1},$reduce:function(doc,pre){
      pre.count++
 },initial:{count:0}})