MongoDB查询shell命令分页查询数据 存储过程 函数 游标使用 mongodb
内嵌文档查询 可用使用 . 符号:
如果要指定键值匹配,可以使用“.” 操作符,比如:{“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 条