1. 程式人生 > >NoSQL_MongoDB_文件的修改_詳解

NoSQL_MongoDB_文件的修改_詳解

以下的資料整理自極客學院的教程。

MongoDB的修改操作與一般的資料庫有些許的不同,預設的修改語句(不加引數)修改的單條記錄,這點值得注意。

update語句講解


upsert  預設引數 {upsert:false}

multi 預設引數 {multi:false}

驗證如下:

multi引數預設false


更新多個的示例語句:

//批量更新操作-寫法1
//db.user.update({name:"sunzhenhua"},{$set:{name:"szh"}},false,true)

//批量更新操作-寫法2
db.user.update({name:"szh"},{$set:{name:"zhs"}},{multi:true})


update的返回值講解


MongoDB的一系列更新操作符


示例:

//連線資料庫
dbService = connect("localhost:27017"); 
//選擇插入集合
db = dbService.getSiblingDB("jike");

//建立bulk物件用於批量插入
db.update_test.drop();
var bulk = db.update_test.initializeUnorderedBulkOp();

//測試資料
var doc1= 
        {
           _id:1,
           name:"xiaoli",
           age:20,
           address:
           {
              province:"GuangDong",
              city:"ShenZhen"      
           }
        }
bulk.insert(doc1);

var doc2= 
        {
           _id:2,
           name:"xiaoli",
           age:20,
           address:
           {
              province:"GuangDong",
              city:"ShenZhen"      
           }
        }
bulk.insert(doc2);

//下面執行插入操作
bulk.execute()



print("========update - $set操作符的使用=======")
/*
 { $set:{field1:value1,....} }
 set操組符用於修改一個欄位的值,如果這個欄位不存在的話,則會建立它。
 注意:使用$set操作符一次可以更新文件的多個欄位
*/
var result = db.update_test.update(
                { name:"xiaoli" },   //更新條件
                {                    //更新內容
                  $set:  
                  {
                     "name":"xiaoli_update",
                     "age":28
                  }
               } 
               ,{multi:true}
            );
printjson( result );

var cursor = db.update_test.find({});
printjson(cursor.toArray())


print("========update - 不使用更新操作符=======")
/*
   如果update 的第二個引數不使用更新操作符,後面的文件會替換掉query返回的文件。
 */
var result = db.update_test.update(
                                   {_id:1},    //更新條件
                                   {age: 26 }  //更新內容
                                  );
printjson( result );
var cursor = db.update_test.find({});
printjson(cursor.toArray())



print("========update - $inc操作符的使用=======")
/*
 {$inc:{"文件的鍵":待增加的值,....}}
 inc操作符用來增加(或減少)已有鍵的值,如果這個欄位不存在的話,則會自動建立。
 注意:1.$inc鍵的值必須為數字,只能用於整型、長整型或浮點數型別。
      2.$inc鍵的值為負數的時,會減少已有鍵的值。
      3.一次可以更新文件的多個欄位
*/

var result = db.update_test.update(
                {_id:1},  //更新條件
                {         //更新內容
                  $inc:  
                  {
                    "age":2
                  }
               } 
            );
printjson( result );
var cursor = db.update_test.find({});
printjson(cursor.toArray())

print("========update - $min操作符的使用=======")
/*
 {$min:{filed1:value1,.....}}
 如果$min操作符中value1的值小於使用query條件返回的文件中filed1欄位對應值的話,就使用value1來替換原有文件的值;
 如果使用query條件返回的文件中filed1欄位的值不存在的話,就會用value1來建立該欄位。
 注意:一次可以更新文件的多個欄位
*/

var result = db.update_test.update(
                {_id:1},  //更新條件
                {         //更新內容
                  $min:  
                  {
                    "age":16
                  }
               } 
            );
printjson( result );
var cursor = db.update_test.find({});
printjson(cursor.toArray())














print("========update - $currentDate操作符的使用=======")
/*
 { $currentDate:{<field1>:<typeSpecification1,...}  }
currentDate 操作符可以將filed1欄位的值更新為當前的最新時間
     主要用於記錄操作的時間,支援Date和timestamp兩種型別
     預設時間用Date型別來表示,也可以通過使用$type操作符來顯式的指定日期格式

 隱式的:{$currentDate: { field1: true} }  field1欄位的值會被更新為Date型別時間
 顯式的:{$currentDate: { { $type: "date" } }  或者
        {$currentDate: { { $type: "timestamp" } }  

注意:1.使用$currentDate操作符 一次可以更新文件的多個欄位
     2.如果field指定的欄位不存在的話,會自動建立
     3.使用$currentDate操作符,主要用來記錄操作時間
*/

var result = db.update_test.update(
                {_id:1},  //更新條件
                {         //更新內容
                  $currentDate:  
                  {
                    "optime_1":true,
                    "optime_2":{$type:"timestamp"}
                  }
               } 
            );
printjson( result );
var cursor = db.update_test.find({});
printjson(cursor.toArray())


對於內嵌文件的更新


示例:


//連線資料庫
dbService = connect("localhost:27017"); 
//選擇插入集合
db = dbService.getSiblingDB("jike");

//建立bulk物件用於批量插入
db.update_test.drop();
var bulk = db.update_test.initializeUnorderedBulkOp();

//測試資料
var doc1= 
        {
           _id:1,
           name:"xiaoli",
           age:20,
           address:
           {
              province:"GuangDong",
              city:"ShenZhen"      
           }
        }
bulk.insert(doc1);

//下面執行插入操作
bulk.execute()



//測試查詢
print("========update - 更新整個文件=======")
/*
 {$set:{field1:value1,....}}
*/
var result = db.update_test.update(
                {_id:1},  //更新條件
                {         //更新內容
                  $set:  
                  {
                     "address": { province:"Beijing",city:"ChaoYang" }
                  }
               } 
            );
printjson( result );
var cursor = db.update_test.find({_id:1});
printjson(cursor.toArray())


print("========update - 更新內嵌的文件的某些欄位=======")
/*
 {$set:{field1.field11:value1,....}}
*/
var result = db.update_test.update(
                        {_id:1},
                        {
                          $set:
                          {
                              "address.city":"GuangZhou"
                          } 
                        }
              );
printjson( result );
var cursor = db.update_test.find({_id:1});
printjson(cursor.toArray())


對於陣列的更新



示例:

//連線資料庫
dbService = connect("localhost:27017"); 
//選擇插入集合
db = dbService.getSiblingDB("jike");

//建立bulk物件用於批量插入
db.update_array_test.drop();
var bulk = db.update_array_test.initializeUnorderedBulkOp();


//測試資料
var doc1 = {
              name:"joe",
              scores:[60,60,61,62]
           }
bulk.insert(doc1);



var doc2 = {
              name:"jack",
              scores:[]
           }
bulk.insert(doc2);

///下面執行插入操作
bulk.execute()


print("========update - $佔位符的使用=======")
/*
 $佔為符 用於表示第一個 滿足query條件的 陣列元素 在陣列中的位置索引
 db.collection.update(
   { <array>: value ... },
   { <update operator>: { "<array>.$" : value } }
 )
*/
var result = db.update_array_test.update(
                { name:"joe",scores:60 },   //更新條件
                {                           //更新內容
                  $set:  
                  {
                     "scores.$":90
                  }
               } 
            );
printjson( result );

//測試一下執行結果
var cursor = db.update_array_test.find({name:"joe"});
printjson(cursor.toArray())



print("========update - $pop操作符的使用=======")
/*
 $pop 用於從刪除陣列的頭部(-1)或尾部(1)刪除一個元素
  { $pop: { <field>: <-1 | 1>, ... } }
*/
var result = db.update_array_test.update(
                { name:"joe"},   //更新條件
                {                           //更新內容
                  $pop:  
                  {
                     scores:1   
                  }
               } 
            );
printjson( result );
//測試一下執行結果
var cursor = db.update_array_test.find({name:"joe"});
printjson(cursor.toArray())





print("========update - $pull操作符的使用=======")
/*
 $pull  刪除陣列中指定的元素  field1的引數可以是一個元素或者關係運算符
 { $pull: { <field1>: <value|query>, ... } }
*/
var result = db.update_array_test.update(
                { name:"joe"},   //更新條件
                {                //更新內容
                  $pull:  
                  {
                     //scores:60
                     scores:{$gte:61}    //使用關係運算符,刪除大於等於61的分數
                  }
                }
           );
printjson( result );
//測試一下執行結果
var cursor = db.update_array_test.find({name:"joe"});
printjson(cursor.toArray())



print("========update - $pullAll操作符的使用=======")
/*
  $pullAll 一次可以刪除多個不同的元素  field1的引數是一個數組
  { $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }
*/
var result = db.update_array_test.update(
                { name:"joe"},   //更新條件
                {                //更新內容
                  $pullAll:
                  {
                     scores:[60,61]
                  }
                }
           );
printjson( result );
//測試一下執行結果
var cursor = db.update_array_test.find({name:"joe"});
printjson(cursor.toArray())



print("========update - $push+$each操作符的使用=======")
/*
{ $push: { <field1>: <value1>, ... } }
{ $push: { <field1>: { <modifier1>: <value1>, ... }, ... } }
注意:
  1.如果fild1不存在的話,$push會自動為file1新增一個數組,並使用value1作為陣列元素
  2.如果待操作文件的filed1對應的欄位值不是一個數組型別的值,執行失敗,會拋錯誤異常。
  3.如果value1是一個數組型別的值的話,push會將整個陣列作為一個元素新增到fild1對應的陣列中。
  4.如果一次要新增多個元素的話,需要使用$push的$each修飾器。
*/
var result = db.update_array_test.update(
                {name:"joe"},   //更新條件
                {               //更新內容
                  $push:  
                  {
                  	 scores:80
                  }
               } 
            );

//測試一下執行結果
var cursor = db.update_array_test.find({name:"joe"});
printjson(cursor.toArray())


var result = db.update_array_test.update(
                {name:"joe"},   //更新條件
                {               //更新內容
                  $push:  
                  {
                     scores:
                     { 
                        $each:[90,92,85],
                        $slice:-4
                        //$position:1 //指定元素的插入位置
                     },
                     
                  }
               } 
            );
printjson( result );

//測試一下執行結果
var cursor = db.update_array_test.find({name:"joe"});
printjson(cursor.toArray())














//測試查詢
print("========update - $push+$each+$sort+$slice操作符的使用=======")
/*
{ $push: { <field1>: <value1>, ... } }
{ $push: { <field1>: { <modifier1>: <value1>, ... }, ... } }

  $each:可以一次插入多個數組元素
  $sort:對陣列元素按照指定欄位進行排序
  $slice:取陣列元素的子集
$push與上面三個操作符聯合使用,可以實現向陣列中新增TopN元素

注意:
  1.三個修改器的執行順序:sort->slice->store
  2.$sort和$slice必須要和$each結合使用
*/
var result = db.update_array_test.update(
                {name:"jack"},   //更新條件
                {                //更新內容
                  $push:  
                  {
                  	 scores:
                  	 {
                  	 	  $each:[ {"科目":"語文","成績":80},
                  	 	  		  {"科目":"數學","成績":95},
                  	 	  		  {"科目":"外語","成績":70},
                  	 	  		  {"科目":"政治","成績":60},
                  	 	  		  {"科目":"計算機","成績":85}
                  	 	  		],

                  	 	  $sort:{"成績":-1}, //對陣列進行降序排序
                  	 	  $slice:3          //Top 3 
                  	 }
                  }
               } 
            );
printjson( result );


//測試一下執行結果
var cursor = db.update_array_test.find({name:"jack"});
printjson(cursor.toArray())