MongoDB的CRUD简介
MongoDB以文档形式存储数据。格式像JSON的键值配对。文档类似于结构化编程语言的关联键值。其中键可持有其他的键值对(例如字典,哈希映射和关联数组).正规的叫法是MongoDB文档是BSON格式。是在JSON基础上再附加额外类型信息的二进制表示。查看更多信息,看文档。
一个MongoDB文档
MongoDB存储所有的文件在集合中。集合就是一组拥有共享的通用索引的文档的群组。集合类似于关系数据库中的表。
一个MongoDB集合
数据库操作
查询
在MongoDB的特定集合中查询目标文档。指定查询标信或条件。MongoDB把符合条件的文档返回给客户端.一个查询返回的匹配的文档的指定字段可以包含一个映射。您可以有选择地修改查询上限,跳过,和对查询排序。
在下面的图中,在查询过程中指定查询条件和排序修饰符:
指定查询条件和排序修饰符的查询过程。
数据修改
数据修改操作指的是创建,更新或删除。在MongoDB,这些操作是对一个单独的集合的数据进行修改.对于更新和删除操作,您可以指定条件来选择文档进行更新或删除。
在下面的图表中,插入操作添加新文档到用户集合.
MongoDB的插入操作的步骤.
相关特点
索引
为了提高通用查询和更新的性能,MongoDB完全支持二级索引。这些索引允许用一个高效的数据结构存储集合的部分视图。大多数索引存储一个字段值或一组字段的所有值......
读操作概述
读操作,或查询,检索存储在数据库中的数据。在MongoDB,查询选择文档在单一的集合中进行。
查询指定标准,或条件。符合条件的文档MongoDB返回到客户端。一个查询返回的匹配的文档的
指定的字段可以包含一个映射。映射限制了MongoDB从网络传到客户端的数据的量。
查询界面
对于查询操作,MongoDB提供了一个db.collection.find()方法.该方法接受查询条件和
映射,并返回匹配的文档的游标。您可以有选择地修改查询上限,跳过,和对查询排序
下图突出了MongoDB的查询操作的部分:
一个MongoDB的查询操作的部分。
下面的图显示了用sql进行的类似的操作。
SQL SELECT语句的组成部分。
例如
db.users.find( { age: { $gt: 18 } }, { name: 1, address: 1 } ).limit(5)
在users集合里查询年龄大于18的文档。指定大于条件,查询标准用大于号(例如 $gt)查询运
算操作。查询最多返回5个符合条件的文档(或者更确切地说,那些文档的游标)。匹配的文档
将只返回_id,name和address字段。
查询行为
MongoDB的查询表现为以下行为:
1.所有MongoDB的查询都在单一的集合里进行。
2.你能对果询结果进行限制,跳过和排序。
3.返回文档的顺序不是固定的,除非你用sort()指定了排序。
4.对已有的文档进行修改(例如更新)用同样的语法进行查询筛选文件。
5.在聚集管道中, $match管道对MongoDB的查询提供分段......
MongoDB游标
在mongo命令行下,在集合中读取操作的主要方法是db.collection.find().这个方法从集合中查询,返回文档们的一个游标。
要查看这些文档,你需要迭代游标。然而,在mongo中,如果返回的游标没有使用var关键字分配给一个变量,游标自动的迭代20次,打印出结果中的20个文档。
例如,在mongo中,从inventory集合中查找类型匹配'food'的文档.找到后会自动打印出20个匹配的文档:
db.inventory.find( { type: 'food' } );
注:可以使用DBQuery.shellBatchSize来改变默认值为20的迭代次数。
一、游标行为
暂无封闭的游标
在默认情况下,闲置10分钟后,服务器将自动关闭游标,或者如果客户端已用尽光标.要覆盖此行为,您可以在查询中指定noTimeout线协议标志;但是,你应该手动关闭游标或用尽光标,在mongo命令行,你可以设置noTimeout 标志:
var myCursor = db.inventory.find().addOption(DBQuery.Option.noTimeout);
游标隔离
因为在游标的有效期是不隔离的,如果那些文档已经改变,可能导致一个文档因为写操作,而返回它的次数不止一次。要处理这种情况,请看快照模式。
游标批处理
MongoDB服务器批量返回查询结果。批量大小不会超过最大BSON文档的大小。对于最大的查询,第一批返回101个文档或者说文档的大小刚好达到1兆字节。随后每批的大小最大为4兆字节.要覆盖批次的默认大小,请用batchSize()和limit()。
......
查询优化
索引可以提高读取操作的效率,减少了数据查询需要操作的处理量。这简化了MongoDB执行全面查询的相关工作。
一、创建索引来支持读操作
如果您的应用程序查询特定的字段或多个字段,查询字段或字段的索引可以阻止查询从整个集合来搜索查找,并返回查询结果。有关索引的详细信息,参考MongoDB的索引的完整文档。
例如:
一个应用程序从inventory集合的type字段上进行查询。类型字段的值是由用户输入的。
var typeValue = <someUserInput>;
db.inventory.find( { type: typeValue } );
为了改善这种查询的性能,添加一个升序或者降序的索引在inventory集合的type字段上。在mongo命令行,您可以使用db.collection.ensureIndex()方法创建索引:
db.inventory.ensureIndex( { type: 1 } )
该索引可以阻止上面的查询从整个集合扫描返回结果。
分析用索引查询的性能,请参阅分析查询性能..
除了优化读取操作,索引可以支持排序操作,并允许更高效的存储利用率。有关创建索引的更多信息参考db.collection.ensureIndex()和索引教程。
对于单字段索引,升序和降序之间的选择是无关紧要的。对于复合索引,选择是重要的。更多信息请参考索引排序。
二、选择性查询
一些查询操作是没有选择性。这些操作不能有效地使用索引或不能使用索引。......
查询计划
MongoDB的查询优化器处理查询,并选择在给定可用的索引查询的最有效的查询计划。这个查询系统在每次查询运行的时候使用这个计划。
查询优化器仅会高速缓存,可以有多个可行的查询计划来执行这些查询。
查询优化器偶尔会重新评估查询计划作为集合的内容更改,以确保最佳的查询计划。您也可以指定索引的优化与索引筛选评估。
您可以使用explain()方法来查看有关给定查询的查询计划统计,这些信息可以帮助你制定索引策略。
一、查询优化
要创建一个新的查询计划,查询优化器:
1.针对几个在并行运行的候选索引的查询。
2.在一个共同的结果缓冲区或缓冲区的匹配记录。
如果候选计划仅包括有序的查询计划,这是一个单一的共同结果缓冲器。
如果候选计划仅包括无序的查询计划,这是一个单一的共同结果缓冲器。
如果候选计划包括有痛了查询计划和无序的查询计划,这是两种通用结果缓冲器,一个用于有序的计划,另一个用于无序的计划。
如查一个索引的结果已经补别一个索引返回,优化处理器会跳过重复的匹配。在两个缓冲区的情况下,他们的数据是冗余的。
3.当下列情况之一发生时,停止测试候选计划选择一个索引:
&nbs......