查询条件:
< : $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}
实际开发中,三个函数组合使用的情况比较多。
例如(分页:第一页):
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}})