您的位置:首页 > 数据库 > Mongodb

mongodb常用命令3

2017-09-19 13:46 253 查看
查询条件:

< : $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这
4000
门课程的?

误区:

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}})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: