NoSQL_MongoDB_文件的修改_詳解
阿新 • • 發佈:2019-02-11
以下的資料整理自極客學院的教程。
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())