标签:style blog io ar color os 使用 sp for
CURD
插入:
Db.foo.insert({“bar”: “baz”});
批量插入能传递一个由文档构成的数组给DB.
目前MONGODB消息长度是16M , 所以批量插入也是有限制的.
删除:
Db.user.remove(...);
清除整个集合:db.drop_collection(“bar”);
更新:
Update();
以下为更新操作的修改器:
$set : 用来指定一个键的值
$inc : 增加和减少
$push : 向数组尾部追加元素
$addToSet : 添加时避免重复, 例如:
Db.user.update({“_id”: “....”}, {‘$addToSet’: {‘emails’: ‘sky3hao@163.com’}})
$addToSet 和 $each 组合起来,可以添加多个不同的值.
$pop : 从数组某一端删除元素
$pull : 基于条件来删除数组元素
“$” : 数组的定位修改器 例如:
Db.blog.update({“comment.author” : “joho”}, {“$set” : {“comment.$.author”: “jim”}})
Upsert方式是update()的第三个参数, 默认为false. 如果为true, 表明没有符合文档就会创建一个新文档. 有就正常更新.
Update()的第四个参数默认也是false, 如果为true, 表明会更新多个文档.
查询
Find(), findOne();
第一个参数是条件, 第二个是指定返回的键. 如:
Db.user.find({‘user’: ‘kevin’}, {‘email’ : 1, ‘age’ : -1);
查询条件操作符:
$lt, $lte, $gt, $gte
$ne 不等于
$in 查询一个键的OR操作
$or 应用与多个键的OR操作
$not 是元条件句. 举个例子:
“$mod” 会将查询的值除以第一个给定值, 若余数等于第二个给定值则返回该结果:
Db.user.find({“id_num”:{“$mod”:[5, 1]}})
上面会返回”id_num”为1, 6, 11, 16等的用户, 要是想返回他的差集就该用到$not了
Db.user.find({“id_num” : {“$not”:{“$mod” : [5, 1]}} });
$exists 判断键值是否存在
条件句是内层文档的键, 而修改器是外层文档的键.
正则表达式 如 db.user.find({“name” : /joe/i})
查询数组
$all 需要通过多个元素来匹配数组
$size 查询指定长度的数组
$slice 返回数组的一个子集 n | [n , m]
查询内嵌文档, 可以使用”.”点表示法.
还有 $elemMatch 这种模糊的命名条件句, 他会限制条件进行分组, 仅当需要对一个内嵌文档的多个键操作时才会用到.
$where查询可以执行任意的javascript代码作为查询条件, 但是性能比较差.
Db.foo.find({“$where” : function() { .......
游标,游标可以对结果进行有效的控制. Limit, skip, sort 这三个方法可以按任意顺序
索引
...ensureIndex({“username”: 1}, {“name”: “username1”);
对某个键创建的索引会加速对该键的查询, 然而,对于其他查询可以没有帮助, 即便是包含了该索引. 只有联合索引可以优化.
Mongo的索引类似于Mysql的索引, 联合索引有方向性, 有左端性.
对增改删都有性能上的影响
唯一索引,如果想确保文档中某个键的值唯一, 就创建一个唯一索引:
db.people.ensureIndex({“username” : 1}, {“unique” : true});
Explain 是分析工具, 只要对游标调用该方法就可以得到查询细节. 他会返回一个文档. 而不是游标本身, 这是和其他游标方法的不同之处, 从而也不能在后面链式调用其他方法.
Db.foo.find().explain();
如果发现MongoDB用了非预期的索引, 可以用hint强制使用某个索引:
Db.c.find( {“age” : 14, “username” : /.*/}).hint( {“username” : 1, “age” : 1});
索引的元信息存储在每个数据库的system.indexes集合中. 不能插入删除.只能通过ensureIndex 或者 droopIndexes操作.
集合名和索引名加起来不能超过127字节.
地理空间索引
db.map.ensureIndex({“gps” : “2d”}); // 注意参数是2D, 而不是代表方向的1 和 -1.
其中, gps 的值必须是某种形式的一对值, 一个包含两个元素的数组或者两个键的内嵌 文档.
一般,空间索引假设值是-180 ~ 180(对经纬度很方便). 也可以指定其他值:
db.d.star.trek.ensureIndex({light-years” : “2d”}, {“min” : -1000, “max” : 1000});
创建了一个2000光年见方的空间索引.
对于空间索引的查询,见以下例子:
Db.map.find({“gps” :{ “$near” : [40, -73]}}).limit(10);
将返回离(40, -73)最近的十个文档.
也可以用geoNear完成相同的操作:
db.runCommand({geoNear: “map”, near:[40, -73], num: 10})
不但可以查询距离,还能找到指定形状内的文档,做法就是将原来的”$near”换 成”$within”
对于矩形,使用$box:
Db.map.find({“gps” : {“$within” : {“$box” : [ [10,20], [15,30] ]}}});
$box的两个参数,第一个指定了左下角坐标, 第二个指定了右上角.
用”$center”来找到圆形内部所有点,参数是圆心和半径: db.map.find({ “gps” : {“$within” : {“$center”: [ [12, 25], 5] }} });
聚合
count() 返回文档总数 ;
Distinct,找出给定键的所有不同的值, 使用时要指定集合和键:
db.runCommand({“distinct” : “foo”, “key” : “age”});
Group 分组聚合:
db.runCommand(
“ns” : “stocks”, // 指定要分组的集合
“key” : “day”, // 指定分组依据的键
“initial” : {“time” : 0}, // 每一组reduce函数调用的初始时间.
“$reduce” : function(doc, prev) { // 两个参数, 当前文档和累加器 文档
Prev.price = doc.price,
Prev.time = doc.time
}
);
完成器, finalizer 是group的一个方法,用以精简从数据库传到用户的数据. 可以修剪结果中的”残枝败叶”:
1..... 2.“finalize” : function(prev) { 3.Var mostPopular = 0; 4.For(var i in prev.tags) { 5.If(prev.tags[i] > mostPopular) { 6.Prev.tag = i; 7.mostPopular = prev.tags[i]; 8.} 9.} 10.} 11..... .... “finalize” : function(prev) { Var mostPopular = 0; For(var i in prev.tags) { If(prev.tags[i] > mostPopular) { Prev.tag = i; mostPopular = prev.tags[i]; } } } ....
Group里的key指定了一个键, 有些应用是需要一个函数作为键使用的, 这样就应该使用”$keyf”:
..... “$keyf” : function(x) { return ...} ....
MapReduce 可以做count, distinct, group能做的一切事, 他是一个可以轻松并行化到多个服务器的聚合方法. 但是速度较慢.
进阶
命令参考
几乎所有mongoDB驱动程序都提供一个类似与runCommand的帮助方法来执行命令.
在shell中执行db.listCommands() 或在驱动程序中执行listCommands.可获得所有的命令列表.
buildInfo 返回mongoDB服务器的版本号和主机的操作系统.
{“buildInfo” : 1}
collStats 返回给定集合的统计信息,数据大小,存储空间, 索引大小等.
{“collStats” : collection}
Distinct 列出集合中满足查询条件的制定键的所有不同值.
{“distinct” : collection, “key” : key, “query”: query}
Drop 删除集合的所有数据
{“drop” : coll}
DropDatabase 删除当前数据库的所有数据
{“dropDatabase”:1}
dropIndexes 删除集合里名为Name的索引,如果名称为”*” , 则会删除全部索引.
{“dropIndexes” : coll, “index”: name}
getLastError 查看本集合执行的最后一次操作的错误信息或者其他状态信息
{“getLastErr” : 1[, “w”: w[, “wtimeout” : timeout]]}
isMaster 检查本服务器是主服务器还是从
{“isMaster” : 1}
listCommands 返回可运行的命令信息
{“listCommands” :1}
listDatabases 列出服务器上所有数据库
{“listDatabase” : 1 }
ping 检测服务器连接是否正常.
{“ping” :1}
renameCollection 将集合a重命名为b
{“renameCollection” : a , “to”: b}
repairDatabase 修复并压缩当前数据库
{“repairDatabase” : 1 }
serverStatus 返回本服务器的管理统计信息
{“serverStatus”:1}
固定集合
MongoDB还支持另外一种集合,固定集合. 要事先创建,而且大小固定不变.
固定集合在新文档插入的时候,如果没有空间,就会自动淘汰最早的文档.
还有两点区别:
不能删除文档.
默认情况下,固定集合没有索引.
固定集合的属性:
插入的速度极快,而且按顺序输出的查询速度也极快.
创建:
db.createCollection(“my_collection”, {capped: true, size :1000});
大小1000字节, 也可以指定文档数量, 例如在后面加 max: 100
把普通集合转换成固定集合:
db.runCommand({convertToCapped: “test”, size: 100000});
自然排序下顺序查询:
Db.my_coll.find().sort({“$natural” :-1})
-1按表示反向插入顺序, 1表示默认顺序.
尾部游标不会在没有结果后销毁. 这种游标只能用在固定集合上.
GridFS
gridFS是一种在mongodb中存储大二进制文件的机制.
可以利用mongofiles工具 和 MongoDB驱动程序操作GridFS.
在命令行下使用mongofiles , 有五个基本操作: put, get, list, search, delete.
服务器端脚本
利用db.eval可以在MongoDb的服务器端执行任意的JavaScript脚本.
Db.eval(“function(x,y,z) {return x + y + z;}”, [num1, num2, num3]);
Print函数可以把调式信息写入数据库日志中.
Db.eval(“print(‘Hello,world’);”);
mongoDb数据库中都有一个特殊的集合:system.js. 用来存放javascript变量. 这些变量可以任何Mongodb的javascript上下文调用. 包括$where子句,db.eval调用,mapReduce作业.
Db.system.js.insert({“_id” : “x”, “value” : 1});
Db.eval(“return x;”);
其中 “x”可以是任意的javascritp代码. 例如可以存放一个函数. 然后之后就可以直接调用了.
最适合使用这个集合是存放一些重用的代码.
数据库应用 DBRef
Dbref 就像一个URL链接到一个文档. 他是一个内嵌文档. 定义他是这样的:
{“$ref” : collection, “$id”: id_value, “$db” : dbname}
标签:style blog io ar color os 使用 sp for
原文地址:http://www.cnblogs.com/whzlw/p/4149714.html