您的位置:首页 > 数据库 > Mongodb

MongoDB 操作手册CRUD概念

2014-10-17 15:39 267 查看

查询

概述

db.testData.find(para1,para2)

para1:查询条件

para2:投影列,1为选择,0为不选择,默认_id列显示。

示例:

db.testData.find({num:{$gt:90},{name:1})//查询num greater than 90的记录的_id,name 字段。

db.testData.find({num:{$lt:5},{name:0})//查询num lower than 5的记录,除name字段外全选。

db.testData.find({},{name:1,num:1,_id:0})//查询所有记录,只显示name,num 字段。

查询过程是先查询出所有符合条件的记录,然后返回其中的所需字段。

指针

在mongo shell中,db.colllection.find()方法返回指针,如果这个指针没有分配给一个使用var的变量,这个指针将自动枚举20次,打印20条记录。

指针行为

非活动指针的关闭

默认情况下,服务器将关闭十分钟内没有活动的或者遍历完成的指针。

要覆盖这个行为,可以声明查询的noTimeout wireprotocol flag,但是这样就需要手动关闭指针或者遍历完全这个指针。

在mongo shell中,可以如此设置这个flag:

var myCursor = db.testData.find().addOption(DBQuery.option.noTimeout);

查看驱动文档获取更多设置这个标志位的信息。对于mongo shell,查看cursor.addOption()获取所有可用的指针标志位列表。

指针隔离

指针在它的生命周期中不是隔离的,因此在的生命周期中写操作可能会导致一条记录返回多次,解决这种情况,查看snapshot mode。

实际测试,在指针执行完查询后,此时对数据进行删除或者新增,结果集中的数据都是查询之时数据库的状态。

指针批处理

mongo服务器以批的形式返回查询结果,批的大小不会超过maximum BSON document大小。对于大多数查询,第一个批返回101条记录,或者仅仅达到超过1mb的记录, 接下来的批大小是4mb。重置批大小,查看batchSize()和limit().

对于包含排序却没有索引的查询,服务器必须加载所有的记录到内存中来执行排序,并且在第一个批中返回所有记录。

cursor.next()函数将会执行获取更多记录的操作,查看还有多少条记录没有遍历,可以用以下方法

var cursor = db.testData.find();

var item = cursor.hasNext()?cursor.next():null;

cursor.objsLeftInBatch();

指针信息

查看数据库信息

db.serverStatus();

查看指针信息

db.serverStatus().metric.cursor;

查询选项

索引通过减少查询操作需要处理的数据数量来改善查询效率。

创建索引以支持读操作

如果你的应用查询一个集合的指定的一个或多个字段,查询字段上的索引可以避免扫描整个集合来获得结果。

指定字段建立索引

db.testData().ensureIndex({num:1});

索引也支持排序和更高效率的存储。

查询的选择性

一些查询是不具有选择性的。这些操作不能有效的使用索引或者根本不能使用索引。

不等操作如$nin和$ne就是非常不可选的,因为它们通常会匹配大量的索引,如此一来,在大多数情况下,一个$nin或者

$ne查询在有索引的情况下可能并不比扫描所有记录快多少。

声明了正则表达式的查询,带有js行内正则表达式或者$regex操作符的表达式,不能使用索引。在字符串开始声明锚点的正则表达式查询可以使用索引。

覆盖查询

索引覆盖一个查询,即覆盖查询,满足:

1.条件字段都有索引

2.所有返回的记录中的字段都在同一索引中有匹配

这些查询中,MongDB不需要检索索引外的数据,这通常比检索整个文档更高效。

例:

集合包含以下索引:{type:1,item:1};

这个索引将覆盖以下只返回item字段的查询

db.testData().find({type:'food',item:/^c/},{item:,_id:0});

却没有覆盖这个包含_id的查询

db.testData().find({type:'food',item:/^c/},{item:1});

查询计划

MongoDB查询优化器根据给定的索引执行并选择最高效的查询计划。查询系统在每次查询的时候使用这些查询计划。

查询优化器仅仅缓存那些有多种可用查询计划的查询类型。随着集合内容的改变,查询优化器偶尔会重新评估查询计划以确保最优查询计划。

你可以在IndexFilters中声明优化器评估哪些索引。

你页可以使用explain()方法来查看给定查询的查询计划的统计数据。这些信息可以帮助你开发indexing strategeies.

<!--暂时看不懂跳过page62-67-->

Query Optimization

查询优化

创建一个新的查询计划,查询优化器需要做:

1.同步运行多个候选索引下的查询

2.在一个一般结果缓存中标记匹配的结果

如果候选查询计划只包括排序查询计划,将只有一个普通结果缓存

如果候选查询计划只包括未排序查询计划,将只有一个普通结果缓存

如果候选查询计划既包括排序又包括未排序查询计划,将有两个普通结果缓存,一个排序的一个未排序的。

如果

<!--暂时看不懂跳过page62-67-->

写操作

插入

概述

若果插入一条不包含_id 字段的记录,客户端库或者mongod实例将添加_id字段并且赋值为一个唯一的ObjectId。

如果声明了_id字段,它的值在这个集合中必须是唯一的。对于写操作,如果试图创建一条重复的_id记录,mongod返回一个key重复的exception。

其他插入方法

也可以使用带有upsert选项的插入方法来添加新的记录到集合中。如果这个选项被设置为true,在有符合条件的记录的情况下,这些方法将修改已有记录,否则将插入新数据。

更新

在MongodDB中,db.collection.update()方法用于修改集合中存在的记录。这个方法可以接受查询条件来确定更新哪些记录,以及一个参数选项设定修改行为,如multi选项来更新多条记录。

例:db.testData.update({num:{$gt:90}},{$set:{name:'name90+'}},{multi:true});

默认的更新行为

默认情况下db.collection.update()方法更新一条记录,带有multi选项的更新所有符合条件的记录。

db.collection.update()或者更新已有记录,或者替换已有记录。

当执行update操作,使得记录的大小超出了的空间大小,update操作将重新分配在上的空间。

MongoDB保留插入时字段的顺序,以下两种情况除外:

_id字段总是第一个字段;

更新包括重命名字段可能导致字段重新排序

2.6中的改变:从2.6开始,MongoDB总是尝试保留记录字段顺序,之前的版本没有。

带有upsert选项的更新

带有upsert为true的更新操作在有符合条件的记录时将更新记录,否则将插入新的记录。

删除

删除操作:db.collection.remove();

例:db.testData.remove({num:91}); //该操作将删除所有符合条件的记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: