以下的资料整理自极客学院的教程。
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:{:
对于内嵌文档的更新
示例:
//连接数据库
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(
{ : value ... },
{ : { ".$" : 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: { : <-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: { : , ... } }
*/
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: { : [ , ... ], ... } }
*/
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: { : , ... } }
{ $push: { : { : , ... }, ... } }
注意:
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: { : , ... } }
{ $push: { : { : , ... }, ... } }
$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())