您的位置:首页 > 编程语言 > Go语言

Mongo官方文档翻译 (四)

2013-01-23 10:42 246 查看
更新操作!

官方文档地址:http://docs.mongodb.org/manual/applications/update/

更新

在数据库的四种基本操作中,更新操作是指那些在MongoDB聚集中修改现有记录或文档的操作。

修改操作用来修改聚集中已经存在的一个或多个文档。MongoDB提供了如下的方式来进行更新操作:

1.update

2.save

注意:仔细思考MongoDB中的update操作的下列行为:

1.当更新操作是的目标文档大小超出了文档原来的大小的时候,更新操作会

在磁盘上重新迁移文档,并且会影响到字段的顺序,这依赖于更新操作的类型!

2.对于如下的驱动版本,所有的写操作都会发出一个getLastError命令,来确认

写操作的结果!

C#, version 0.7

Java, version 2.10.0

Node.js, version 1.2

Perl, version 0.601.1

PHP, version 1.4

Python, version 2.4

Ruby, version 1.8

更新

update()方法是用来修改MongoDB聚集中文档的基础方法。默认情况下,update()方法更新一个文档,

如果使用了multi 操作,update()方法会更新聚集中所有符合query标准的文档。update()方法既可以

用新文档替换现有的文档,也可以对现有文档的指定字段进行修改。

update()方法有如下句法:

db.collection.update( <query>,<update>,<options> )

SQL中类似的操作:update()方法类似于SQL 中的UPDATE子句,并且:

1.<query>参数类似于WHERE子句,并且:

2.<update>参数类似于SET子句。

默认的update()方法更新一条文档类似于SQL中带有LIMIT 1子句的UPDATE。

带有multi操作的update方法类似于SQL中没有LIMIT限制的UPDATE子句!

通过下面的示例来思考update()方法的使用:

1.如果<update>参数只包含更新操作如:$set操作符,update()方法会更新类似的字段,如果要

更新子文档中的字段可以通过.操作符。

下面的操作查询了bios聚集的所有文档中_id字段等于1的文档的子文档name中maddle字段值为

Warner并且在awards字段中添加一个新元素。

db.bios.update(

{ _id: 1 },

{

$set: { 'name.middle': 'Warner' },

$push: { awards: { award: 'IBM Fellow', year: 1963, by: 'IBM' } }

}

)

2.如果<update>参数包含$unset操作,update()方法会将其中包含的字段从文档中移除。

下面的操作查询了bios聚集的文档中第一个_id字段等于3的文档,并且移除例如该文档的

birth字段:

db.bios.update(

{ _id: 3 },

{ $unset: { birth: 1 } }

)

3.如果<update>参数包含的字段并不存在于当前文档中,update()会把这些字段添加到当前文档

中。

下面的操作查询了bios聚集的文档中第一个拥有_id等于3的文档,而且在该文档的添加了mnranch字段以及子文档name中

添加了一个aka的字段:

db.bios.update(

{ _id: 3 },

{ $set: {

mbranch: 'Navy',

'name.aka': 'Amazing Grace'

}

}

)

4.如果<update>参数只包含字段和值的pairs,update()方法会利用<update>参数中的文档对象替换当前文档中

除了_id字段以外的全部字段。

下面的操作查询了bios聚集中第一个name字段等于{ first: 'John', last: 'McCarthy' } 的文档,并且利用

<update>中的文档替换了该文档除_id字段之外的所有字段:

db.bios.update(

{ name: { first: 'John', last: 'McCarthy' } },

{ name: { first: 'Ken', last: 'Iverson' },

born: new Date('Dec 17, 1941'),

died: new Date('Oct 19, 2004'),

contribs: [ 'APL', 'J' ],

awards: [

{ award: 'Turing Award',

year: 1979,

by: 'ACM' },

{ award: 'Harry H. Goode Memorial Award',

year: 1975,

by: 'IEEE Computer Society' },

{ award: 'IBM Fellow',

year: 1970,

by: 'IBM' }

]

}

)

5.如果update操作要求更新一个数组字段中的元素:

1.update()方法会通过调用该元素的下表于.操作符来进行更新。

MongoDB中的数组下表是从0开始的!

2.下面的操作将bios聚集中_id字段为1的文档的contribs数组字段的第二个元素进行了更新:

db.bios.update(

{ _id: 1 },

{ $set: { 'contribs.1': 'ALGOL 58' } }

)

3.update()方法可以在目标数组字段的下标未知的情况下通过$操作符来更新。数组字段必须必须出现在quer参数中,

以便于update()方法决定对那个数组元素进行更新.

下面的操作将更新bios聚集中_id字段等于3的文档的contribs数组字段中包含“complier“的字段,如果找到,update()

方法会将第一个比配的文档的属性更新为A compiler:

db.bios.update(

{ _id: 3, 'contribs': 'compiler' },

{ $set: { 'contribs.$': 'A compiler' } }

)

6.如果<options>参数中multi属性值为true或1,则update()方法会修改查询结果中所有匹配的文档。

下面的操作会查询bios聚集的所有文档中名为awards的子文档中award属性为“Turing”的文档,并设置该文档的

属性为true,并且multi属性为ture!

db.bios.update(

{ 'awards.award': 'Turing' },

{ $set: { turing: true } },

{ multi: true }

)

7.如果把<options>参数中upsert属性设置为true或1,并且没有能匹配<query>参数的文档存在,那么update()方法会在聚集

中插入一个新的文档!

下面的操作会查询bios聚集中文档_id字段值为11而且name字段值为{ first: 'James', last: 'Gosling'}的文档,如果检索

能找到一个文档,update()方法会表现为updage操作,如果没有匹配到文档,update()会插入一个新文档,该文档由<query>中的

字段和值以及<update>参数中指定对相应字段的更新操作!

db.bios.update(

{ _id:11, name: { first: 'James', last: 'Gosling' } },

{

$set: {

born: new Date('May 19, 1955'),

contribs: [ 'Java' ],

awards: [

{ award: 'The Economist Innovation Award',

year: 2002,

by: 'The Economist' },

{ award: 'Officer of the Order of Canada',

year: 2007,

by: 'Canada' }

]

}

},

{ upsert: true }

)

注意:如果<update>参数仅包含字段-值的数据对,则新文档中会包含<update>参数中指定的字段-值 数据对信息。如果<update>参数

只是包含一些update operators,那么,新的文档会从<query>参数中取得字段-值信息以及<update>参数中对相关字段所定义的操作(set,unset等)!

保存

save()方法会根据文档中的_id字段来更新或者新建一个文档。save()方法和update()方法在对于_id字段在upsert操作和<query>参数上是很相似的。

save()方法有如下的句法:

db.collection.save( <document> )

通过下面的例子思考save()方法的用法:

1.如果<document>参数包含的_id字段可以再聚集中找到,则save()方法会用<document>文档替换已存在的文档。

下面的操作会查询bios聚集的文档中_id字段值为:ObjectId("507c4e138fada716c89d0014")的文档,并且用<document>参数去更新和替换匹配到的文档!

db.bios.save(

{

_id: ObjectId("507c4e138fada716c89d0014"),

name: { first: 'Martin', last: 'Odersky' },

contribs: [ 'Scala' ]

}

)

2.如果<document>参数中_id字段不存在或者存在_id字段但是没有找到匹配的文档,则save()函数会表现为一个insert操作!

下面的操作会自动的为<document>参数添加_id字段,并且赋值一个唯一的ObjectId,然后插入这个构造好的新文档!

db.bios.save(

{

name: { first: 'Larry', last: 'Wall' },

contribs: [ 'Perl' ]

}

)

更新操作:

字段的操作:

1.$inc

2.$rename

3.$set

4.$unset

数组的操作

1.$

2.$addToSet

3.$pop

4.$pullAll

5.$pull

6.$pushAll

7.$push

位操作

1.$bit

隔离操作

1.$isolated
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: