3 创建,更新及删除文档

来源:互联网 发布:windows 加密文件系统 编辑:程序博客网 时间:2024/06/07 09:52

插入并保存文档

db.coll.insert()

插入的机制,是使用驱动程序将数据转为Bson的形式,然后将其送入数据库。数据库解析Bson,检验是否包含"_id"键并且文档不超过4MB

如果验证正确,则插入只是简单的将文档原样存入数据库中,这样有可能会插入无效的数据。如果需要检查,则可以在启动的时候执行 --objcheck 选项进行文档结构的检查。

MongoDB在插入时并不执行代码,所以这块天生就没有注入式攻击的可能

 

删除文档

db.coll.remove()

上述命令会删除集合coll的所有文档,但不会删除集合本身,原有的索引也会保留。

Remove可以接受一个参数作为删除条件,比如删除mailing.list集合中所有"optout"true的人:

Db.mailing.list.remove({"optout":true})

如果要删除一个集合的所有数据,建议直接删除集合然后建立索引比删除所有数据快的多

如果只是删除文档中的一个属性,则可以先得到此对象,然后删除此对象的属性(假如删除xiaozhe文档中的年龄属性):

Var obj=db.coll.findOne({"name":"xiaohze"})

delete obj.age

 

更新文档

更新文档使用update方法进行修改,update有两个参数,一个是条件,一个是修改器文档,描述对找到的文档做哪些修改。

例如:在coll集合中有一个原始文档为{ "_id" : ObjectId("4ffa6e9550274818c2372320"), "name" : "xiaozhe"},现将原始文档更新增加一个年龄和性别。

Var xiaozhe=db.coll.findOne({"name":"xiaozhe"})

Xiaozhe.age=22

Xiaozhe.sex="male"

Db.coll.update({"name":"xiaozhe"},xiaozhe)

 

一般修改器

通常文档只会有一部分要更新,利用原子的更新修改器,可以使这种部分更新极为高效。更新修改器是种特殊的键,用来指定复杂的更新操作,比如调整、增加或者删除键,还可能是操作数组或者内嵌文档。

$inc

用来增加已有键的值或者在键不存在时创建一个键。例子:假如我需要统计访问www.xiaozhe.com页面的访问次数,每当访问一次就把count加上1,可以通过修改器 "$inc" 进行修改。

db.coll.update({"url":"www.xiaozhe.com"},{"$inc":{"count":1}})  只要这样就可以达到效果。

$set

用来指定一个键的值,如果这个键不存在,则创建它。如果存在,则进行更新文档。这对更新模式或者增加用户定义键来说非常方便。例如:给用户新增一个爱好是篮球。

db.coll.update({"_id":ObjectId("xxxxx")},{"$set":{"favor":"baskteball"}}) ,不仅可以加字符串,还可以加数组{"$set":{"favor":["aaa","bbbb"]}}

$unset

用来删除某个指定的键,如果删除用户的爱好.

db.coll.update({"name":"xiaozhe"},{"$unset":{"favor":1}})至于为什么后面要加1呢,因为javascript为严格的Json对象,所以后面加个1是为了确保删除的是一个Json对象。

 

数组修改器

$push

如果指定的键存在,则可以用"$push"向已有的数组末尾加入一个元素,要是没有键,则会自动创建一个数组(对象也可以)。

db.blog.update({"name":"xiaozhe"},{"$push":{"arr":["a","b""c"]}})  

db.blog.update({"name":"xiaozhe"},{"$push":{"arr":{"a":1,"b":2,"c":3}}}) 

$ne$addToSet

经常遇到如果这个值不在数组中,就把这个值加进去,那就可以使用$ne。例如:如果dlr不在数组arr里面,则把dlr加入到arr中。

db.coll.update({"arr":{"$ne":"dlr"}},{"$push":{"arr":"dlr"}})

但是有时候$ne经常出问题,所以还是用$addToSet比较好。

因为使用$addToSet插入的数据可以避免重复。

db.test.update({"name":"xiaozhe"},{"$addToSet":{"arr":"ddd"}})

$addToSet$each组合起来可以添加多个不同的值

例如:想一次添加多个邮件信息。

db.coll.update(

{"_id" : ObjectId("4ffe7e9d7f62b4e75dc1512b"},

{"$addToSet":{"emails":{"$each":["a@q.com","b@q.com"]}}}

)

$pop

可以删除数组中的元素,{"$pop":{"key":1}}是从数组末尾删除,{"$pop":{"key":-1}}是从数组开头删除。

 db.test.update(

.. {"name":"xiaozhe"},

.. {"$pop":{"email":1}}

.. )

$pull

可以将匹配的部分全部删掉,例如数组num3个值1,2,3,4,现在删除数组num中的2

db.coll.update(

..{"name":"xiaozhe"},

..{"$pull":{"num":2}}

)

 

数组的定位修改器

若数组有多个值,而我们只想对其中的一部分操作,可以通过位置或者定位操作符("$")

例如:有一个文档的数据为:

data={

 

... "content":"xiaozhe",

... "comments":[

 {"name":"a","age":"11"},

... {"name":"b","age":"12"},

... {"name":"3","age":"13"}

... ]

... }

 

我要修改其中comments.2.name的值3c,但是如果我们必须要提前知道name3的值在数组是第几位,为了解决这个问题,我们使用$定位符。

db.coll.update(

... {"comments.name":"3"},

... {"$set":{"comments.$.name":"c"}}

... )

 

注意:定位符只会更新第一个匹配的元素,如果有多个name3,则会匹配第一个找到的文档数据。

 

$upsert

upsert是一种特殊的更新,要是没有文档符合更新的条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新

例如:我们有一个点击量计算,如果存在url则点击增1,如果不存在则创建。(注意,update的第三个参数就是upsert是否开启)

shell>db.coll.update({“url”:”www.xx.com”}:{“$inc”:{“count”:1}},ture).

 

save

save是一个shell函数,可以在文档不存在的时候插入,文档存在时更新。它只有一个参数,要是这个文档存在“_id”键,save会调用upsert,否则会调用插入。

例子:var db.foo.findOne()

x.num= 42

db.foo.save(x)

要是不用save,最后一行的更新会很罗嗦,如下:

db.foo.update({“_id”:x._id},x)

 

更新多个文档

默认情况下,更新只会对符合条件的第一个文档执行更新操作,如果要达到多个符合条件的文档一起更新,则需要将update的第四个参数设为true

注意:有可能服务器默认会更新所有匹配的文档,所以建议以后显示的表示是否要做多个文档的更新。

例如:要给每位用户生日的时候发送一个生日礼物。

db.coll.update(

{“birthday”:”13/11/1990”},

{“$set”:{“gift”:”Happy Birthday!”}},

false,

true

要想知道到底有多少个用户被更新了,可以执行如下命令:

db.runCommand({getLastError:1}),里面的n值就是更新的数量。

 

返回已更新的文档

findAndModify

getLastError命令仅能得到有限的信息,并不能返回已更新的文档,可以使用findAndModify命令来做到,但是速度更新速度慢了点,但是得到的信息多一点其中有几个参数如下:

findAndModify:字符串,集合名

query:查询文档,用来检索文档的条件

sort:排序结果的条件

update:修改器文档,对所找到的文档执行更新

remove:布尔类型,表示是否删除文档

new:布尔型,表示返回的是更新前还是更新后的文档,默认是更新前

注意:updateremove必须有一个并且只能有其中一个。

Exp: 更新user文档,用户名为xiaozhe,年龄修改为21

Var obj=({"findAndModify":"user",

"query":{"name":"xiaozhe"},    //查询条件

"update":{"$set":{"age":21}}, //更新值

"new":true   //返回更新后文档

)

直接打印obj

 

原创粉丝点击