zoukankan      html  css  js  c++  java
  • 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( <document> )
    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( <query>,
                          <update>,
                          { upsert: true } )

    如果没有文档符合查询要求<query>,则插入文档,举例如下:
    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( <query>, <update>, <options>
    使用方法同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
    $inc Increments the value of the field by the specified amount.
    $rename Renames a field.
    $setOnInsert Sets the value of a field upon documentation creation during an upsert. Has no effect on update operations that modify existing documents.
    $set Sets the value of a field in an existing document.
    $unset Removes 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.
    $addToSet Adds elements to an existing array only if they do not already exist in the set.
    $pop Removes the first or last item of an array.
    $pullAll Removes multiple values from an array.
    $pull Removes items from an array that match a query statement.
    $pushAll Deprecated. Adds several items to an array.
    $push Adds an item to an array.

    Modifiers

    NameDescription
    $each Modifies the $push and $addToSet operators to append multiple items for array updates.
    $slice Modifies the $push operator to limit the size of updated arrays.
    $sort Modifies the $push operator to reorder documents stored in an array.

    Bitwise

    NameDescription
    $bit Performs bitwise AND and OR updates of integer values.

    Isolation

      NameDescription
    $isolated Modifies behavior of multi-updates to improve the isolation of the operation.
  • 相关阅读:
    Jenkins学习记录(三)
    Jenkins学习记录(二)
    并发编程
    黏包及解决方法
    socket通信,三次握手,四次挥手
    异常处理
    元类与魔法方法
    封装方法与多态
    组合与封装
    继承
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/3156167.html
Copyright © 2011-2022 走看看