y ## 前言
对于数据库的操作,无非就是增删改查,只有掌握这些基础的知识我们才能够好好掌握MongoDB,所以接下来就学习一下最基本的应用增删改的操作了,查询的内容已经在上篇文章<a href="http://www.jianshu.com/p/9a45413307b4">MongoDB查询知多少</a>发布了。
插入语句
与其它的关系型数据库一样,增加记录可以使用insert语句来完成,下面来查看一下例子。
db.users.insert({id:1,name:"peter",age:21,email:"veionestudio@outlook.com",phone:"183********"});
tips:
(1)第一次插入数据时,不需要预先创建一个集合(users),插入数据时它会自动创建这个集合。
(2)每次插入数据时如果没有显示指定的字段"_id",则会默认创建一个主键"_id"。在关系数据库中主键大多数是数值类型,而且是自动增长类型的序列。而MongoDB中的主键值类型则为ObjectId类型,这样设计好处是可以更好地支持分布式存储。其中ObjectId类型的值由12个字节组成,前面4个字节表示的是一个时间戳,精确到秒,紧接着的3个字节表示的是机器唯一标示,接着2个字节表示的进程id,最后3个字节是一个随机的计数器。
(3)在MongoDB中,每一个集合都必须有一个"_id"字段,不管是自动生成还是指定的,值都是必须唯一的,如果插入重复值将会抛出异常。下面有个小栗子。
db.users.insert({"_id":1,name:"james",phone:"12345678905"});
如果插入同样的值,将会抛出以下异常。
根据错误我们可以清楚的知道,duplicate key error collection,主键已经重复了。
修改语句
与关系型数据库类型,MongoDB修改语句由update完成,只是MongoDB和普通的关系型数据库有些不同而已。总的来说修改分为两种,一种是只针对具体的目标字段,其它不变;另一种是取代性的更改,即修改具体目标字段后,其它的字段将会被删除。其语法格式如下:
<pre>
db.cooolection.update(query,update,<upsert>,<multi>)
参数说明如下:
query参数是一个查询选择器,值类型为document。
update参数为需要修改的地方,值类型为document,如果update参数只包括字段选项,没有操作符,则会发生取代性的更改。
upsert为一个可选参数,boolean类型,默认值为false。当值为true时,update将会匹配更改内容,如果没有更新到匹配的内容,则会插入一个新的文档到集合中。
multi参数为一个可选的参数,boolean类型,当为true时,update方法将更新素有匹配到的文档。
</pre>
下面通过实例代码来更新操作:
1、更改指定的的字段值
db.user.update({name:"peter"},{$set:{name:"James"},{$inc:{age:22}});
这个操作将会匹配到name:"peter"的第一个文档,将其中的字段name设为"James",字段"age"增加22,其它字段保持不变。
2、更改指定字段其它字段被清除掉
db.user.update({name:"peter"},{"name":"James"})
这个操作将更改集合中与name:"peter"匹配的第一个文档,将其中的字段name设置为"James"后,文档中除了"_id"之外,将全部被清除掉。
3、更改多个文档中的指定字段
db.goods.update({name:"surface",,{$set:{price:6999}},{multi:true});
由于利用了可选参数multi,这个操作将更改集合中与name:"surface"匹配的所有文档,将其中的字段设为6999,其它字段不变。
4、update找不到匹配的文档时则插入新文档
db.goods.update({name:"macbook pro"},{$set:{price:12600}},{upsert:true});
因为利用了可选参数upsert,这个操作如果匹配不到文档,则会进行插入的操作。
删除语句
MongoDB中删除操作remove也是数据库CRUD操作中最基本的一种,与关系型数据库中的delete类型,语法如下:
<pre>
db.collection.remove(<query>,<justOne>);
参数说明如下:
query参数为可选参数,查询选择器,类似关系型数据库中的where条件语句。
justOne参数也是可选参数,是一个boolean值类型,表示是否只输出匹配的第一个文档,相当于关系型数据库中的limit 1条件。
有一条需要注意的是:
如果remove没有指定任何参数,它将删除集合中的所有文档,但是不会删除集合对应的索引数据。如果想删除集合中的所有文档,同时也删除集合的索引,我们可以使用MongoDB针对集合提供的drop方法。
</pre>
下面举几个栗子。
1、删除匹配的所有文档
db.goods.remove({name:"macbook pro"});
2、删除匹配的第一个文档
db.goods.remove({name:"nokia"});
3、删除所有文档,但不会删除索引
db.goods.remove();
锁机制
MongoDB与关心性数据库类似,也是通过锁机制来保证数据的完整性和一致性的。MongoDB利用读写锁来支持并发操作,读锁可以共享,写锁具有排它性。当一个读锁存在时,其它读操作也可以用这个读锁;但是当一个写锁存在时,其它任何读写操作都不能共享这把锁,当一个读和写都等待一个锁时,MongoDB将优先分配锁给写操作。
总结
通过MongoDB的学习,我们学会了基本的操作增删改的操作,insert、update、remove操作,相对于关系型数据来说语法差不多。