mongodb dml
覆蓋整個文件
> db.obj.update(
... { name: "obj2" },
... {
... f1: 1,
... f2: "a"
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
... { name: "obj2" },
... {
... f1: 1,
... f2: "a"
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({f1:1})
{ "_id" : ObjectId("5502a740773fc1f962baf14e"), "f1" : 1, "f2" : "a" }
{ "_id" : ObjectId("5502a740773fc1f962baf14e"), "f1" : 1, "f2" : "a" }
修改指定內容
更新操作支援的選項
$set 設定欄位的值
$inc +=
$mul *
$rename 重新命名欄位
$setOnInsert 當設定了$upsert:true,並且的確新插入了文件時,設定新文件的屬性。
$unset 刪除欄位
$min 只有當指定的值小於原有值時才更新
$max 只有當指定的值大於原有值時才更新
$currentDate 將欄位的值設定為當前時間
$mul *
$rename 重新命名欄位
$setOnInsert 當設定了$upsert:true,並且的確新插入了文件時,設定新文件的屬性。
$unset 刪除欄位
$min 只有當指定的值小於原有值時才更新
$max 只有當指定的值大於原有值時才更新
$currentDate 將欄位的值設定為當前時間
修改子文件的名稱和陣列,並且新增一個欄位lastModified,內容是當前時間
> db.obj.update(
... { name: "obj1" },
... {
... $set: {
... "subObj.subName": "sub-name-1",
... "subObj.subArr": ["a", "b"]
... },
... $currentDate: { lastModified: true }
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
... {
... $set: {
... "subObj.subName": "sub-name-1",
... "subObj.subArr": ["a", "b"]
... },
... $currentDate: { lastModified: true }
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.findOne();
{
"_id" : ObjectId("5502a2ef773fc1f962baf14b"),
"name" : "obj1",
"arr" : [
{
"elemName" : "elem1",
"elemValue" : 1
},
{
"elemName" : "elem2",
"elemValue" : 2
}
],
"subObj" : {
"subName" : "sub-name-1",
"subArr" : [
"a",
"b"
]
},
"lastModified" : ISODate("2015-03-13T08:55:27.802Z")
}
{
"_id" : ObjectId("5502a2ef773fc1f962baf14b"),
"name" : "obj1",
"arr" : [
{
"elemName" : "elem1",
"elemValue" : 1
},
{
"elemName" : "elem2",
"elemValue" : 2
}
],
"subObj" : {
"subName" : "sub-name-1",
"subArr" : [
"a",
"b"
]
},
"lastModified" : ISODate("2015-03-13T08:55:27.802Z")
}
更改多行
update預設只能更改1個文件,不管匹配到多資料,最後只會顯示
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
要修改多個文件,需要用第3個引數:
> db.obj.update(
... { name: {$regex: /bulk/} },
... {
... $set: {
... "subObj.subName": "sub-name-update",
... },
... $currentDate: { lastModified: true }
... },
... {multi: true}
... )
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
... { name: {$regex: /bulk/} },
... {
... $set: {
... "subObj.subName": "sub-name-update",
... },
... $currentDate: { lastModified: true }
... },
... {multi: true}
... )
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
不存在則建立
> db.obj.update(
... { name: "xxx" },
... {
... name: "xxx",
... value: 123
... },
... { upsert: true }
... )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502ab51fa04f5d70cc725c1")
})
... { name: "xxx" },
... {
... name: "xxx",
... value: 123
... },
... { upsert: true }
... )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502ab51fa04f5d70cc725c1")
})
> db.obj.find({name: "xxx"});
{ "_id" : ObjectId("5502ab51fa04f5d70cc725c1"), "name" : "xxx", "value" : 123 }
{ "_id" : ObjectId("5502ab51fa04f5d70cc725c1"), "name" : "xxx", "value" : 123 }
也可以用$set
> db.obj.update(
... { name: "yyy" },
... {$set: {
... name: "yyy",
... value: 9
... }},
... { upsert: true }
... )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502acf6fa04f5d70cc725c2")
})
... { name: "yyy" },
... {$set: {
... name: "yyy",
... value: 9
... }},
... { upsert: true }
... )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502acf6fa04f5d70cc725c2")
})
> db.obj.find({name: "yyy"})
{ "_id" : ObjectId("5502acf6fa04f5d70cc725c2"), "name" : "yyy", "value" : 9 }
{ "_id" : ObjectId("5502acf6fa04f5d70cc725c2"), "name" : "yyy", "value" : 9 }
為已存在的文件和新文件設定不同的值
原文件
> db.obj.find({name: "xxx"}, {_id:0});
{ "name" : "xxx", "value" : 123 }
{ "name" : "xxx", "value" : 123 }
更新為1000
> db.obj.update(
... { name: "xxx" },
... {
... $set: {value: 1000},
... $setOnInsert: {newDoc: true}
... },
... { upsert: true }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.update(
... { name: "xxx" },
... {
... $set: {value: 1000},
... $setOnInsert: {newDoc: true}
... },
... { upsert: true }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "xxx"}, {_id: 0});
{ "name" : "xxx", "value" : 1000 }
{ "name" : "xxx", "value" : 1000 }
如果建立了新文件,設定newDoc屬性為true
> db.obj.update(
... { name: "zzz" },
... {
... $set: {value: 1000},
... $setOnInsert: {newDoc: true}
... },
... { upsert: true }
... );
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502edf9ec6530e2da657454")
})
... { name: "zzz" },
... {
... $set: {value: 1000},
... $setOnInsert: {newDoc: true}
... },
... { upsert: true }
... );
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502edf9ec6530e2da657454")
})
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : 1000, "newDoc" : true }
{ "name" : "zzz", "value" : 1000, "newDoc" : true }
注意不能$set不能和$setOnInsert包含一樣的屬性,否則在新建立文件時會報錯
> db.obj.update(
... { name: "zzz" },
... {
... $set: {value: 1000},
... $setOnInsert: {value: 2000}
... },
... { upsert: true }
... );
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 16836,
"errmsg" : "Cannot update 'value' and 'value' at the same time"
}
})
... { name: "zzz" },
... {
... $set: {value: 1000},
... $setOnInsert: {value: 2000}
... },
... { upsert: true }
... );
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 16836,
"errmsg" : "Cannot update 'value' and 'value' at the same time"
}
})
更新陣列操作支援的操作
$ 更新從陣列裡取到的第一個元素。
$addToSet 如果陣列裡不包含這個元素,就新增元素。
$pop 移除陣列的第一個或最後一個元素。-1表示移除第一個。1表示移除最後一個
$pullAll 從陣列中移除所有匹配的值(指定多個值)。
$pull 從陣列中移除所有匹配的值。
$pushAll 向陣列新增多個值。
$push 向陣列新增一個值。
$addToSet 如果陣列裡不包含這個元素,就新增元素。
$pop 移除陣列的第一個或最後一個元素。-1表示移除第一個。1表示移除最後一個
$pullAll 從陣列中移除所有匹配的值(指定多個值)。
$pull 從陣列中移除所有匹配的值。
$pushAll 向陣列新增多個值。
$push 向陣列新增一個值。
原資料(陣列裡有數字,和帶重複值的字串)
> db.obj.update({name: "zzz"}, {name: "zzz", value: [1,2,3,4,5,6,7,8,9, "aaa", "aaa", "bbb", "bbb", "aa", "bb"]});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.findOne({name: "zzz"});
{
"_id" : ObjectId("5502edf9ec6530e2da657454"),
"name" : "zzz",
"value" : [
1,
2,
3,
4,
5,
6,
7,
8,
9,
"aaa",
"aaa",
"bbb",
"bbb",
"aa",
"bb"
]
}
{
"_id" : ObjectId("5502edf9ec6530e2da657454"),
"name" : "zzz",
"value" : [
1,
2,
3,
4,
5,
6,
7,
8,
9,
"aaa",
"aaa",
"bbb",
"bbb",
"aa",
"bb"
]
}
把包含a的都移除
> db.obj.update(
... { name: "zzz" },
... { $pull: { value : {$regex: /a/} } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"})
{ "_id" : ObjectId("5502edf9ec6530e2da657454"), "name" : "zzz", "value" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, "bbb", "bbb", "bb" ] }
... { name: "zzz" },
... { $pull: { value : {$regex: /a/} } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"})
{ "_id" : ObjectId("5502edf9ec6530e2da657454"), "name" : "zzz", "value" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, "bbb", "bbb", "bb" ] }
把包含bbb的,和3移除
($pullAll後面的陣列裡只能是明確的值,不支援正規表示式)
> db.obj.update(
... { name: "zzz" },
... { $pullAll: { value : ["bbb", 3] } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 4, 5, 6, 7, 8, 9, "aaa", "aaa", "aa", "bb" ] }
... { name: "zzz" },
... { $pullAll: { value : ["bbb", 3] } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 4, 5, 6, 7, 8, 9, "aaa", "aaa", "aa", "bb" ] }
修改第一個匹配aaa的元素,改成AAA
(1 查詢選項裡必須有陣列元素的過濾條件, 2 "value.$"的雙引號不能省略)
> db.obj.update(
... { name: "zzz", value: "aaa" },
... { $set: { "value.$" : "AAA" } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, "AAA", "aaa", "bbb", "bbb", "aa", "bb" ] }
... { name: "zzz", value: "aaa" },
... { $set: { "value.$" : "AAA" } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, "AAA", "aaa", "bbb", "bbb", "aa", "bb" ] }
用$push在指定位置上插入多個值
> db.obj.update(
... { name: "zzz", value: "aaa" },
... {
... $push: { value : {$each: [100, 200, 300], $position: 2} },
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 100, 200, 300, 3, 4, 5, 6, 7, 8, 9, "aaa", "aaa", "bbb", "bbb", "aa", "bb" ] }
... { name: "zzz", value: "aaa" },
... {
... $push: { value : {$each: [100, 200, 300], $position: 2} },
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 100, 200, 300, 3, 4, 5, 6, 7, 8, 9, "aaa", "aaa", "bbb", "bbb", "aa", "bb" ] }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26239116/viewspace-1485422/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Parallel DMLOracleParallel
- DML_The OUTPUT Clause
- OGG 簡單DML同步
- Mysql DML 新增資料MySql
- MySQL DML運算元據MySql
- SQLServer DML操作阻塞SELECT查詢SQLServer
- 入門MySQL——DML語句篇MySql
- DDL、DML、DCL、DQL相關操作
- MySQL基礎之DML語句MySql
- Sysbench-0.5改成只有DML操作
- SQL學習___03:DML語法SQL
- 雲原生最佳實踐系列 5:基於函式計算 FC 實現阿里雲 Kafka 訊息內容控制 MongoDB DML 操作函式阿里KafkaMongoDB
- unusable index對DML/QUERY的影響Index
- MySQL全面瓦解5:資料操作-DMLMySql
- 原創:oracle DML介紹與使用Oracle
- MySQL的DDL和DML操作語法MySql
- 【學習】SQL基礎-010-DMLSQL
- MySQL-DML(Data Manipulation Language)詳解MySql
- MySQL alter 新增列對dml影響MySql
- [20210519]是否可能導致DML失效.txt
- [20240325]FORCE_MATCHING_SIGNATURE與DML.txt
- 6.3. 基本SQL語句——6.3.2. DMLSQL
- 資料庫DML監控一例資料庫
- MySQL 的資料管理及 DML 語句MySql
- SQL基礎——DML(插入、修改和刪除)SQL
- oracle全文索引之commit與DML操作Oracle索引MIT
- Oracle 檢視可以DML操作的條件Oracle
- KunlunDB對MySQL私有DML語法的支援MySql
- jdbc執行DML程式設計舉例JDBC程式設計
- Oracle 19c 新特性:ADG的自動DML重定向增強讀寫分離--ADG_REDIRECT_DMLOracle
- MongoDBMongoDB
- [20181116]18c DML 日誌優化.txt優化
- [20190120]行連結遷移與dml.txt
- [20180725]exadata的hcc壓縮與dml更新.txt
- 暑期自學 Day 10 | 資料庫 (二)- DML資料庫
- MongoDB系列--深入理解MongoDB聚合(Aggregation )MongoDB
- 【必知必會的MySQL知識】③DML語言MySql
- [20190911]12c dml redo優化2.txt優化
- 資料庫:淺談DML、DDL、DCL的區別資料庫