Mongo官方文档翻译 (四)

来源:互联网 发布:重庆邮电大学人工智能 编辑:程序博客网 时间:2024/06/11 21:06
更新操作!
官方文档地址: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
原创粉丝点击