码迷,mamicode.com
首页 > 数据库 > 详细

mongodb笔记

时间:2014-12-07 20:18:15      阅读:346      评论:0      收藏:0      [点我收藏+]

标签: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.

其中, 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变量这些变量可以任何Mongodbjavascript上下文调用包括$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}

mongodb笔记

标签:style   blog   io   ar   color   os   使用   sp   for   

原文地址:http://www.cnblogs.com/whzlw/p/4149714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!