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}); //该操作将删除所有符合条件的记录。
相关文章推荐
- MongoDB 操作手册CRUD 删除 remove
- MongoDB CRUD 操作手册
- MongoDB 操作手册CRUD 更新 update
- MongoDB 操作手册CRUD插入
- MongoDB 操作手册CRUD 事务 两步提交
- MongoDB 操作手册CRUD 查询性能分析
- MongoDB 操作手册CRUD查询指针
- MongoDB 操作手册CRUD查询
- MongoDB—— 写操作 Core MongoDB Operations (CRUD)
- MongoDB—— 读操作 Core MongoDB Operations (CRUD)
- mongodb之java CRUD 简单操作
- MongoDB—— 写操作 Core MongoDB Operations (CRUD)
- MongoDB—— 读操作 Core MongoDB Operations (CRUD)
- MongoDB—— 读操作 Core MongoDB Operations (CRUD)
- MongoDB入门教程(包含安装、常用命令、相关概念、使用技巧、常见操作等)
- MongoDBcrud操作,采集部分代码
- MongoDb操作手册
- MongoDB—— 读操作 Core MongoDB Operations (CRUD)
- MongoDb操作手册
- 二、MongoDB 基本概念 及 CRUD