插入并保存文档
插入数据可以使用insert方法向目标集合插入一个文档。
db.foo.insert({"bar" : "baz"})
批量插入
批量插入使用batchInsert函数实现批量插入,它与insert函数非常像,只是它接受的是一个文档数组作为参数。
db.foo.batchInsert([{"_id" : 0}, {"_id" : 1}, {"_id" : 2}])
插入校验
插入数据时,MongoDB只对数据进行基本的检查:
如果没有"_id"字段,就自动增加一个;
所有文档都必须小于16M。
删除文档
db.foo.remove()
更新文档
使用update来更新数据库中的文档。
“$set”修改器
“$set”用来指定一个字段的值,如果这个字段不存在,则可以创建它。
使用“$unset”则可以直接删除这个字段和相应的值。
删除数据是永久性的,不能撤销,也不能恢复。 删除文档通常很快,但是如果要清空整个集合,那么使用drop直接删除集合会更快(然后在这个空集合上重建各项索引)。
增加和修改
“$inc”修改器用来增加已有的键的值,或者该键不存在那就创建一个。对于更新分析数据,因果关系,投票或者其他由变化数值的地方,只用这个都会非常的方便。
"$inc"和“$set”的用法类似,就是专门来增加(和减少)数字的。“$inc”只能用于整形,长整形或双精度浮点型的值。要是用在其他类型的数据上就会导致操作失败,例如null,布尔型以及数字构成的字符串。
添加元素
“$push”会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。
将数组做俄日数据集来使用
你可能想将数组作为数据集使用,保证数组中的元素不会重复。可以在查询文档中用“$ne”来实现。
删除元素
有几个从数组中删除元素的方法。若是把数组看成是队列或者栈,可以用“$pop”,这个修改器可以从数组的任何一端删除元素。{"$pop":{"key":1}} 从数组末尾删除一个元素, {"$pop":{"key":-1}} 则从头部删除。
“$pull”会将所有匹配的文档删除,而不是只删除一个。
修改器的速度
有的修改器运行速度比较块。$inc能就地修改,因为不需要改编文档的大小,只需要将键的值修改一下(对文档的大小的改变),所以非常的块。而数组修改器可能会改变文档的大小,就会慢一些。
将文档插入到MongoDB中时,依次插入的文档在磁盘上的位置是相邻的。因此如果一个文档变大了,原先的位置就放不了这个文档,这个文档就会被移动到集合中的另一个位置。
upsert
upsert是一种特殊的更新。要是没有找到符合条件的更新的文档,就会以这个条件和更新文档为基础创建一个新的文档。upsert非常方便,不必预置集合,同一套代码既可以用于创建新的文档又可以用于更新文档。
更新多个文档
默认情况下,更新只能对符合匹配条件的第一个文档进行操作。要是有多个文档符合条件,只有第一个文档会被更新,其他文档不会发生变化。要更新所有匹配的文档,可以将update的第4个参数设置为true。
返回被更新的文档
调用getLastError仅能够获得关于更新的有限信息,并不能返回被更新的文档。可以通过findAndModify命令得到被更新的文档。这对于操作队列以及执行其他需要进行原子性取值和赋值。
findAndModify命令有很多可以使用的字段:
findAndModify 字符串,集合名
query 查询文档,用于检索文档的条件
sort 排序结果的条件
update 修改器文档,用于对匹配的文档进行更新
remove 布尔类型,表示是否删除文档
new 布尔类型,表示返回更新前的文档还是更新后的文档
fields 文档中需要返回的字段(可选)
upsert 布尔类型,值为true时表示这是一个upsert,默认值是false
写入安全机制
写入安全(Write Concern)是一种客户端设置,用于控制写入的安全级别。默认情况下,插入,删除和更新都会是一直等待数据库的响应,然后才会继续执行。通常遇到错误时,客户端会抛出一个异常。
两种最基本的写入安全机制是应答写入和非应答写入。应答写入是默认的方式:数据库会给出响应,告诉你写入操作是否成功执行。非应答式写入不返回任何响应。+
通常来说,应用程序应该使用应答式写入。但是,对于一些不是特别重要的数据(比如日志或者是批量加载数据),你可能不愿意为了自己不关心的数据而等待数据库的响应。这种情况下,可以使用非应答式写入。
尽管非应答式写入不返回数据库错误,但是这并不代表应用程序不需要作错误检查。如果尝试向已经关闭的套接字(socket)执行写入,或者写入套接字时发生了错误,都会引起异常。