mongodb常用命令3

查询条件:

< : $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}})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值