写操作概述
一个写操作可以是任何在MongoDB实例中的创建或者修改数据的操作。在MongoDB中,写操作作用于一个单独的集合。在MongoDB中所有的写操作在一个单独文档级别是原子的。
在MongoDB中有三种写操作,如果你能指定标准或条件,符合条件的文档将更新或者删除。这些操作使用相同的查询语法来指定标准的读操作。
MongoDB允许应用程序以确定写入操作不需要确认的可接受水平。更多信息查看写关注。
一、创建
创建操作添加新的文档到一个集合中。在MongoDB中,db.collection.insert()方法执行创建操作。
下面的图表高亮突出了MongoDB插入操作部分。
MongoDB插入操作部分
下面的图表显示了在sql中同样的查询操作。
sql插入操作部分
例子
下面的操作插入一个新的文档到users集合。新文档有四个字段:name,age,status和_id。_id字段总是会添加到文档中,就算MongoDB不存在这个字段。
db.users.insert(
{
name: "sue",
age: 26,
status: "A"
}
)
更多信息,查阅do.collection.insert()和插入文档。
一些更新操作也能创建记录。如果一个更新操作用upsert标志,而且查询没有匹配的文档,更新操作会插入一个新的文档。如果有匹配的文档,更新操作会对这些文档进行修改。
用一个upsert,应用程序会在insert和update两者之间决定单独调用执行哪一个。update()方法和save()方法两个都能执行一个unsert。查看用update()和save()方法执行一个unsert的更多详细信息。
查看:
SQL到MongoDB映射的MongoDB的写操作和相应的SQL语句的更多实例。
写行为
如果你添加一个新文档没有_id字段,客户端库或mongod实例添加一个_id字段和填充这个字段用一个唯一的ObjectId。
如果你指定了_id字段,他的值必须在这个集合里是唯一的。对于操作写入优先,如果你尝试用一个重复的_id值创建一个文档,Mongod会返回一个重复key的异常。
二、更新
更新操作修改在一个集合里已经存在的文档。在MongoDB中,db.collection.update()和 db.collection.save()方法执行更新操作。该db.collection.update()方法可以接受查询条件来确定要更新的文档,以及作为一个选项来更新多个文档。这个方法还可以接受,影响其如多选项更新多个文档的行为选择。
下面的图表高亮显示一个MongoDB更新操作部分。
一个MongoDB更新操作部分。
下面的图表显示在SQL中同样的操作。
SQL更新语句部分
例子:
db.users.update(
{ age: { $gt: 18 } },
{ $set: { status: "A" } },
{ multi: true }
)
这个更新操作设置在user表里符合年龄大于18的条件的文档的status字段的值为A。
更多信息,查看db.collection.update()和db.collection.save(),还有修改文档的实例。
更新行为
默认情况下,db.collection.update()方法更新一个单一的文档,不过,用multi选项,update() 可以更新一个集合里匹配查询的所有文档。db.collection.update()还可以更新现有文档的指定的字段或者替换文档。更多详情查看db.collection.update。
执行更新操作时会为在已分配空间上的文档增加文档大小。更新操作重新定位磁盘上的文件。
MongoDB保留写入操作时文档字段排序除了以下情况:
_id字段总是文档的第一个字段。
更新包括字段名重命名可能会导致文档中的字段的重新排序。
2.6版本的变化:从2.6版开始,MongoDB积极尝试保留在文档中字段的排序。在2.6版之前,MongoDB并不积极尝试保留在文档中字段的排序。
db.collection.save()方法可以替换一个单独的文档和仅能更新一个单独的文档。更多信息查看db.collection.save()和插入文档。
三、删除
删除操作从集合中删除文档。在MongoDB中,db.collection.remove()方法执行删除操作。db.collection.remove方法接收一个查询条件决定删除哪些文档。
下面的图表高亮显示一个MongoDB删除操作的部分
M ongoDB的删除操作部分。
下面的图表显示在SQL中同样的操作。
SQL删除语名高亮部分。
例子
db.users.remove(
{ status: "D" }
)
从用户集合中删除查询条件为状态是“D”的用户。
删除行为
在默认情况下,db.collection.remove()方法删除匹配它的查询的所有文档。然而,这个方法能接接一个limit标志仅删除一个文档。
四、写操作的分离
单个文件的修改是永远原子的,即便在写操作修改该文件中的多个子文件。对于修改多个文件的写操作,该操作作为一个整体不是原子的,和其他操作可能交错。
没有其他的操作都是原子的。你可以,但是,尝试用分离操作分离一个写操作影响多个文档。
以分离的写操作序列从其他的读写操作,请参阅执行两阶段提交。