请通过浏览器功能收藏网页

MongoDB查询shell命令分页查询数据 存储过程 函数 游标使用 mongodb

发布时间:2018-09-06 14:19:56  作者:本站编辑  来源:本站原创  浏览次数:
我有话说 | 分享 |
www.javainfo.com.cn 上干货 欢迎收藏


内嵌文档查询 可用使用 . 符号:

如果要指定键值匹配,可以使用“.” 操作符,比如:{“name.first”:”a”}


直接使用count()的话,得到的是整个记录的条数

如果要获取按条件查询后记录的条数,需要指定count(true或者非0的数)

限制返回的记录条数的命令:limit(要返回的条数)

限制返回的记录条数起点的命令:skip(从第几条开始返回)

排序的命令:sort({要排序的字段:1为升序,-1为降序})

:可以对多个字段进行排序

:MongoDB处理不同类型的数据是有一定顺序的,有时候一个键有多种类型的值,其排序顺序是预先定义好的,从小到大如下:


(1)最小值 (2)null (3)数字 (4)字符串

(5)对象/文档 (6)数组 (7)二进制数据 (8)对象id

(9)布尔类型 (10)日期型 (11)时间戳 (12)正则表达式

(13)最大值

 

分页查询:组合使用limit,skipt和sort

当然也可以使用其他方式来分页,比如采用自定义的id,然后根据id来分页

> db.user.find().sort({age:1});

{ "_id" : ObjectId("5b8caa8d98cd08437710c6fb"), "name" : "wwwkjfd", "age" : 22 }

{ "_id" : ObjectId("5b8f33b5dfb2a160dbb01a86"), "name" : "newuser2", "age" : 22, "addr" : "china qianxi " }

{ "_id" : ObjectId("5b8f3950dfb2a160dbb01a8b"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f33a9dfb2a160dbb01a84"), "name" : "newuser0", "age" : 23, "addr" : "china lubei" }

{ "_id" : ObjectId("5b8caa9d98cd08437710c6fc"), "name" : "w543rr", "age" : 32 }

{ "_id" : ObjectId("5b8f393fdfb2a160dbb01a8a"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8cc36198cd08437710c6fd"), "name" : "wj", "age" : 33, "addr" : "unit states" }

{ "_id" : ObjectId("5b8cc3d798cd08437710c6fe"), "name" : "wj555", "age" : 33, "addr" : "unit states" }

{ "_id" : ObjectId("5b8cc40798cd08437710c6ff"), "name" : "wj878ee", "age" : 33, "addr" : "unit states" }

{ "_id" : ObjectId("5b8660e8295c86cc5adba7cb"), "name" : "wj", "age" : 44 }

{ "_id" : ObjectId("5b8f3913dfb2a160dbb01a88"), "name" : "1111", "age" : 44, "addr" : "china" }

{ "_id" : ObjectId("5b8f392adfb2a160dbb01a89"), "name" : "2111", "age" : 44, "addr" : "china tangshan" }

{ "_id" : ObjectId("5b8ca98a98cd08437710c6fa"), "name" : "jjj", "age" : 54, "addr" : "河北大街333号" }

{ "_id" : ObjectId("5b8c8ae398cd08437710c6f9"), "name" : "ggg", "age" : 55 }

{ "_id" : ObjectId("5b8cc40798cd08437710c700"), "name" : "wj", "age" : 67, "addr" : "russain", "log" : true }

{ "_id" : ObjectId("5b8f33b5dfb2a160dbb01a85"), "name" : "newuser", "age" : 88, "addr" : "china tangshan " }

排序后 跳过4个文档  取出3个文档

> db.user.find().sort({age:1}).skip(4).limit(3);

{ "_id" : ObjectId("5b8caa9d98cd08437710c6fc"), "name" : "w543rr", "age" : 32 }

{ "_id" : ObjectId("5b8f393fdfb2a160dbb01a8a"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8cc36198cd08437710c6fd"), "name" : "wj", "age" : 33, "addr" : "unit states" }


查询给定键的所有不重复的数据,命令:distinct

语法:db.runCommand({“distinct”:集合名,“key”:”获得不重复数据的字段”});

      db.runCommand({"distinct":"user","key":"name"});  获取所有姓名,不包含重复值

{

"values" : [

"wj",

"ggg",

"jjj",

"wwwkjfd",

"w543rr",

"wj555",

"wj878ee",

"newuser0",

"newuser",

"newuser2",

"1111",

"2111",

"3111",

"www"

],

"ok" : 1

}


游标获取及循环方法 

var c = db.users.find({xx});   数据范围是自己定义的

   循环游标,可以用集合的方式或 迭代模式

while(c.hasNext()){printjson(c.next());}

c.forEach(function(obj){ print(obj);});

通过游标 计算出有age属性文档的 age总和, 游标有个特点,在执行一次之后,就被释放了,不能重复使用

> var xx = 0;

> var dd = db.temp.find({age:{$exists:1}});

> dd.forEach(function(obj){  xx = xx + obj.age;  print(xx); });

22

54

106

121

136

存储过程

1:MongoDB的存储过程其实就是个自定义的js函数

2:使用db.system.js.save({“_id”:名称,value:函数});

3:可以通过如下命令查看:db.system.js.find();

4:可以通过如下命令调用:db.eval(名称);

  

  函数引用模式

> var dd = db.temp.find({age:{$exists:1}});

> var ageSum = function(a,b){return a+b};

> var xx = 0;

> dd.forEach(function(obj){  xx =ageSum(xx,obj.age);   print(xx); });

22

54

106

121

136


存储过程模式:     其本质就是  数据库的查询方法及 数据操作方法 可用放到 js 函数里执行 

var sumAgeProc = function(){ var xx = 0; var dd = db.temp.find({age:{$exists:1}}); dd.forEach(function(obj){ xx = xx + obj.age; }); return xx; };

    > db.system.js.save({"_id":"sumAgeProc",value:sumAgeProc});

    db.system.js.find();

{ "_id" : "sumAgeProc", "value" : { "code" : "function (){ var xx = 0; var dd = db.temp.find({age:{$exists:1}}); dd.forEach(function(obj){ xx = xx + obj.age; }); return xx; }" } }

> db.eval("sumAgeProc()");  调用存储过程

WARNING: db.eval is deprecated   eval 函数已经不建议使用了

136     计算结果与函数一致


如有疑问 请留言 欢迎提供建议
  • 0

    开心

  • 0

    板砖

  • 0

    感动

  • 0

    有用

  • 0

    疑问

  • 0

    难过

  • 0

    无聊

  • 0

    震惊

评论已有 0