chaosxin 发表于 2015-7-8 07:35:35

MongoDB—— 写操作 Core MongoDB Operations (CRUD)

  MongoDB使用BSON文件存储在collection中,本文主要介绍MongoDB中的写操作和优化策略。
主要有三种写操作:
      Create
      Update
      Delete

Create:可以分为两种基本操作——insert和updates with the upsert option
  
Insert()
BSON文件最大为16M;_id通常作为主key
为了测试写操作是否成功,可以调用getLastError函数{ getLastError: 1 }
db.collection.insert()
insert方法在第一次调用的时候,自动创建collection。
以下例子中bios为collection名,根据自己情况修改。
例如:
db.bios.insert(
   {
   _id: 1,
   name: { first: 'John', last: 'Backus' },
   birth: new Date('Dec 03, 1924'),
   death: new Date('Mar 17, 2007'),
   contribs: [ 'Fortran', 'ALGOL', 'Backus-Naur Form', 'FP' ],
   awards: [
               {
               award: 'W.W. McDowell Award',
               year: 1967,
               by: 'IEEE Computer Society'
               },
               {
               award: 'National Medal of Science',
               year: 1975,
               by: 'National Science Foundation'
               },
               {
               award: 'Turing Award',
               year: 1977,
               by: 'ACM'
               },
               {
               award: 'Draper Prize',
               year: 1993,
               by: 'National Academy of Engineering'
               }
             ]
   }
)
如果插入操作没有指定_id,则会自动生成一个唯一的id。
使用中括号,同时插入多个文档。
db.bios.insert(
   [
   {
       _id: 3,
       name: { first: 'Grace', last: 'Hopper' },
       title: 'Rear Admiral',
       birth: new Date('Dec 09, 1906'),
       death: new Date('Jan 01, 1992'),
       contribs: [ 'UNIVAC', 'compiler', 'FLOW-MATIC', 'COBOL' ],
       awards: [
               {
                   award: 'Computer Sciences Man of the Year',
                   year: 1969,
                   by: 'Data Processing Management Association'
               },
               {
                   award: 'Distinguished Fellow',
                   year: 1973,
                   by: ' British Computer Society'
               },
               {
                   award: 'W. W. McDowell Award',
                   year: 1976,
                   by: 'IEEE Computer Society'
               },
               {
                   award: 'National Medal of Technology',
                   year: 1991,
                   by: 'United States'
               }
               ]
   },
   {
       _id: 4,
       name: { first: 'Kristen', last: 'Nygaard' },
       birth: new Date('Aug 27, 1926'),
       death: new Date('Aug 10, 2002'),
       contribs: [ 'OOP', 'Simula' ],
       awards: [
               {
                   award: 'Rosing Prize',
                   year: 1999,
                   by: 'Norwegian Data Association'
               },
               {
                   award: 'Turing Award',
                   year: 2001,
                   by: 'ACM'
               },
               {
                   award: 'IEEE John von Neumann Medal',
                   year: 2001,
                   by: 'IEEE'
               }
               ]
   },
   {
       _id: 5,
       name: { first: 'Ole-Johan', last: 'Dahl' },
       birth: new Date('Oct 12, 1931'),
       death: new Date('Jun 29, 2002'),
       contribs: [ 'OOP', 'Simula' ],
       awards: [
               {
                   award: 'Rosing Prize',
                   year: 1999,
                   by: 'Norwegian Data Association'
               },
               {
                   award: 'Turing Award',
                   year: 2001,
                   by: 'ACM'
               },
               {
                   award: 'IEEE John von Neumann Medal',
                   year: 2001,
                   by: 'IEEE'
               }
               ]
   }
   ]
)
调用save()函数,通过查询collection中的_id域,来决定使用insert还是update。
upsert flags 当插入的文档已经存在,需要对原文当进行覆盖的时候使用此标记。
db.collection.update( ,
                      ,
                      { upsert: true } )
如果没有文档符合查询要求,则插入文档,举例如下:
db.bios.update(
   {
   _id: 7,
   name: { first: 'Ken', last: 'Thompson' }
   },
   {
   $set: {
             birth: new Date('Feb 04, 1943'),
             contribs: [ 'UNIX', 'C', 'B', 'UTF-8' ],
             awards: [
                     {
                         award: 'Turing Award',
                         year: 1983,
                         by: 'ACM'
                     },
                     {
                         award: 'IEEE Richard W. Hamming Medal',
                         year: 1990,
                         by: 'IEEE'
                     },
                     {
                         award: 'National Medal of Technology',
                         year: 1998,
                         by: 'United States'
                     },
                     {
                         award: 'Tsutomu Kanai Award',
                         year: 1999,
                         by: 'IEEE'
                     },
                     {
                         award: 'Japan Prize',
                         year: 2011,
                         by: 'The Japan Prize Foundation'
                     }
                     ]
         }
   },
   { upsert: true } //如果文档存在,覆盖
)
Update()
主要包括两种操作,update和save
db.collection.update( , ,
使用方法同insert中介绍。
下面分情况举例:
1、更新文件中的域
db.bios.update(
   { _id: 1 },
   {
   $set: { 'name.middle': 'Warner' },
   }
)
更新子文档name中的middle域为warner
2、添加新的域
db.bios.update(
   { _id: 3 },
   { $set: {
             mbranch: 'Navy',
             'name.aka': 'Amazing Grace'
         }
   }
)
添加mbranch域 和子文档name的aka域
3、移除域
db.bios.update(
   { _id: 3 },
   { $unset: { birth: 1 } }
)
4、更新数组
db.bios.update(
   { _id: 1 },
   { $set: { 'contribs.1': 'ALGOL 58' } }
)
更新contribs数组中第二个元素的值
5、定位,然后更新元素
db.bios.update(
       { _id: 3, 'contribs': 'compiler' },
       { $set: { 'contribs.$': 'A compiler' } }
    )
定位id为3,contribs中存在compiler元素的位置,更新为A compiler
6、向数组添加元素
db.bios.update(
   { _id: 1 },
   {
   $push: { awards: { award: 'IBM Fellow', year: 1963, by: 'IBM' } }
   }
)
添加一个新的awards域的元素
7、更新多个文档
db.bios.update(
   { 'awards.award': 'Turing' },
   { $set: { turing: true } },
   { multi: true }
)
save()函数可以用以下函数来解释:function save( doc ) {
if( doc["_id"] ) {
       update( {_id: doc["_id"] }, doc, { upsert: true } );
    }
else {
       insert(doc);
}
}
Update Operators 操作符


Fields
   NameDescription$incIncrements the value of the field by the specified amount.$renameRenames a field.$setOnInsertSets the value of a field upon documentation creation during an upsert. Has no effect on update operations that modify existing documents.$setSets the value of a field in an existing document.$unsetRemoves the specified field from an existing document.
Array Operators

   NameDescription$Acts as a placeholder to update the first element that matches the query condition in an update.$addToSetAdds elements to an existing array only if they do not already exist in the set.$popRemoves the first or last item of an array.$pullAllRemoves multiple values from an array.$pullRemoves items from an array that match a query statement.$pushAllDeprecated. Adds several items to an array.$pushAdds an item to an array.
Modifiers
   NameDescription$eachModifies the $push and $addToSet operators to append multiple items for array updates.$sliceModifies the $push operator to limit the size of updated arrays.$sortModifies the $push operator to reorder documents stored in an array.
Bitwise
   NameDescription$bitPerforms bitwise AND and OR updates of integer values.Isolation
     NameDescription$isolatedModifies behavior of multi-updates to improve the isolation of the operation.
页: [1]
查看完整版本: MongoDB—— 写操作 Core MongoDB Operations (CRUD)