本篇文章各节描述了在集合上执行的基本文档管理任务,包括插入和删除。本章介绍了控制数据库写入请求的行为的选项。你还将学习MongoDB允许你用来更新文档的更新结构,而不是你可能已经在SQL中看到的冗长而复杂的查询字符串。
1,了解数据库更改选项
当你更改数据库时,MongoDB Node.js驱动程序需要知道如何在更改过程中处理连接。因此,每一个更改数据库的操作都允许你传递可选定options参数,
选项 | 说明 |
w | 指定数据库连接的写入关注的级别 |
wtimeout | 指定等待写入关注完成的时间量,以毫秒为单位。这个值被加到正常的连接超时值中 |
fsync | 一个布尔值,当设置为true时,表示写请求在返回前需要等待fsync完成 |
journal | 一个布尔值,当设置为true时,表示写请求在返回前需要等待journal(日志)同步完成 |
serializeFunctions | 一个布尔值,当设置为true时,表示附加到对象的函数存储在文档中时应进行序列化 |
forceServerObjectId | 一个布尔值,当设置为true时,表示由客户端设置的任何对象ID值在插入过程中将被服务器覆盖 |
checkKeys | 一个布尔值,当设置为true时,则插入是,文档的键要在数据库中进行检查。 |
upsert | 一个布尔值,当设置为true时,表示如果没有与更新请求匹配的文档,则一个新的文档将被创建 |
multi | 一个布尔值,当设置为true时,表示如果有多个文档与更新请求的查询匹配,则所有文档都会被更新。当设置为false时,只有找到的第一个文档被更新 |
new | 一个布尔值,当设置为true时,表示返回由findAndModify()方法新修改的对象,而不是返回修改前版本。默认为false |
2,了解数据库更新运算符
在mongoDB中执行对象的更新时,你需要确切地指定需要改变说明字段,以及需要如何改变。不像SQL那样需要创建冗长的查询字符串来定义更新,在MongoDB中可以实现update对象与运算符来定义究竟如何更改文档中的数据。
运算符 | 说明 |
$inc | 按指定量递增字段的值 |
$rename | 重命名字段。操作格式:field:new_name |
$setOnInsert | 设置当在更新操作中创建一个新的文档时,其字段的值。操作格式:field:value |
$set | 设置现有文档中一个字段的值。操作格式:field:new_value |
$unset | 从现有文档中删除指定的字段。操作格式:field:"" |
$ | 用作占位符,以更新符合一个更新中的查询条件的第一个元素 |
$addToSet | 往现有数组添加元素,仅当它们在该集合中不存在时才插入。操作格式:array_field:new_value |
$pop | 删除数组的第一个或最后一个条目。如果pop_value是-1时,则第一个元素件被删除。如果pop_value为1时,则最后一个元素被删除。操作格式:array_field:pop_value |
$pullAll | 删除数组中的多个值。这些值作为数组传递到字段名。操作格式:array_field:[value1,value2....] |
$pull | 删除与查询语句匹配的数组项。 |
$push | 将条目添加到数组 |
$each | 修改$push和$addToSet运算符来追加多个条目用于数组更新。 |
$slice | 修改$push运算符,以限制更新的数组的大小 |
$sort | 修改$push运算符来对存储在数组中的文档重新排列 |
$bit | 对整数值执行按位AND和OR更新。 |
3,将文档添加到集合
对文档的一些列操作可以看: https://mp.csdn.net/postedit/80452460
4,了解query对象
在匹配文档的时候,经常会用到query对象,下表是一些query对象常用的运算符
运算符 | 说明 |
field:value | 匹配有一个字段值等于指定值的文档。例如:{name:"myName"} |
$gt | 匹配大于在查询中指定的值的值。例如:{size:{$gt:5}} |
$gte | 匹配大于等于在查询中指定的值。例如:{size:{$gte:5}} |
$in | 匹配任何在查询中指定的数组中存在的值。例如:{name:{$in:['item1','item2']}} |
$lt | 匹配小于在查询中指定的值的值。例如:{size:{$lt:5}} |
$lte | 匹配小于或等于在查询中指定的值的值 |
$ne | 匹配所有不等于在查询中指定的值的值 |
$nin | 匹配没有在查询中指定的数组中存在的值 |
$or | 将查询子句用逻辑OR连接起来,并返回匹配任何子句的条件的所有文档。例如:{$or:[{size:{$lt:5}},{size:{$gt:10}}]} |
$and | 将查询子句用逻辑AND连接起来,并返回同时匹配所有子句条件的所有文档 |
$not | 反转查询表达式的效果,并返回与查询表达式不匹配的文档。 |
$nor | 将查询子句用逻辑NOR连接起来,并返回与两个子句都不匹配的所有文档。 |
$exists | 匹配具有指定字段的文档。例如:{specialField:{$exists:true}} |
$type | 选择一个字段是指定的BSON类型号的文档。例如:{specialField:{$type:<BSONtype>}} |
$mod |
对某个字段的值进行取模运算,并选择匹配指定结果的文档。取模运算的值被指定为数组,第一个数是除数,第二个数是余数 :{number:{$mod:[2,0]}} |
$regex | 选择值与指定正则表达式匹配的文档 |
$all | 匹配包含在查询中指定的所有元素的数组。例如:{myString:{$regex:'some.*exp'}} |
$elemMatch | 选取子文档的数组中的元素匹配所有指定$elemMatch条件的字段的文档。例如:{myArr:{$elemMatch:{value:{$gt:5},size:{$lt:3}}}} |
$size | 选取数组字段是指定大小的文档。例如:{mtArr:{$size:5}} |
5,了解查询options对象
选项 | 说明 |
limit | 指定返回的文档的最大数量 |
sort | 用[field,<sort_order>]元素数组来指定文档的排列顺序,这里sort_order为了 表示升序,为-1表示降序 |
fields | 指定一个对象,其字段匹配应包括或排除在返回的文档中的字段。值为1表示包括,而0表示排除。你只能包含或排除,fields:{name:1,value:1} |
skip | 指定返回一个文档之前从查询结果中跳过的文档数量。通常在对结果集分页的情况下使用 |
hint | 迫使在服务器上执行查询时会发生什么的解释,而不是实际运行查询。当你试图调试/优化复杂的查询时,这是必不可少的 |
snapshot | 一个布尔值,如果为true,则创建一个快照查询 |
timeout | 一个布尔值,如果为true,则表示游标允许超时 |
maxScan | 指定执行查询返前烧扫描文档的最大数量。如果你的集合拥有数百万个对象,而你不想查询永远运行下去时是有用的 |
comment | 指定将在MongoDB日志中输出的字符串。这可以在诊断问题时帮助你更容易地识别查询 |
readPreference | 指定是从主服务器,辅助复制服务器,还是只在复制服务器集中最近的MongoDB服务器读取来执行查询 |
numberOfRetries | 指定查询执行失败之前超时重试的次数。默认值:5 |
partial | 一个布尔值,结果为true,则表示为对在分片系统*享的数据进行查询时,游标会返回部分结果 |
6,对结果进行分组
当对大型数据集执行操作时,基于一个文档中的一个或多个字段的不同值对结果进行分组是常常很有用的。虽然你可以在检索出文档后编码做到这一点,但更有效的却是让MongoDB把它作为以及遍历文档的单个请求的组成部分来为你做这件事。
要对查询的结果进行分组,你可以使用Collection对象上的group()方法。group()请求首先收集所有符合query的文档,然后添加一个group对象的数组,基于一组keys的不同值,对group对象进行操作,并返回group对象的数组。gruop()方法的语法如下所示:
group(keys,query,initial,reduce,finalize,command,[options],callback)
gruop()方法的参数如下所示。
- keys:这可以是一个表达分组的依据(GROUP BY)的键的对象,数组,或者函数。最简单的方法是在一个对象中指定键,如{field1:true,field2:true};或在一个数组中指定,如['first','last']
- query:query对象定义了初始集中包括的文档。
- initial:指定汇总数据时,执行分组使用的初始goup对象。要为每组不同的键都创建一个初始group对象。最常见的用途是一个用于跟踪与键匹配的项数的计数器。例如{"count":0}
- reduce:这个函数有两个参数,obj和prev。这个函数在每个与查询匹配的文档上执行。obj参数是当前文档,prev是有initial参数创建的对象。然后,你可以使用obj对象,以新值更新prev对象,
- finalize:该函数接受一个参数,obj,它是从initial参数得到的最终obj,其内容有reduce函数作为prev更新。在把数组在响应中返回之前,对每个不同的键生成的对象都调用此函数。
- command:这是个一个布尔值,如果为true,则表示该命令的运行使用内部group(分组)命令,而不是eval()。默认值为true。
- options:此对象允许你定义readPreference选项
- callback:此选项接受一个错误作为第一个参数和results对象的数组作为第二个参数
var MongoClient = require('mongodb').MongoClient; MongoClient.connect("mongodb://localhost/",function(err,db){ var myDB = db.db("words"); myDB.collection("word_stats",groupItems); setTimeout(function(){ db.close(); },3000); }); function groupItems(err,words){ words.group(['first','last'], {first:'0',last:{$in:['a','e','i','o','u']}}, {"count":0}, function(obj,prev){prev.cpunt++;},true, function(err,results){ console.log("\n'O' words grouped by first and last " + "latter that end with a vowel:"); console.log(results); }); }