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())



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值