MongoDB的基本操作包括文檔的創建、刪除、和更新
文檔插入
1、插入
#查看當前都有哪些數據庫 > show dbs; local 0.000GB tim 0.000GB #使用 tim數據庫 > use tim; switched to db tim #查看都有哪些集合 > show collections; user > db.user.in db.user.initializeOrderedBulkOp( db.user.insert( db.user.insertOne( db.user.initializeUnorderedBulkOp( db.user.insertMany( #使用insert方法插入文檔,以{}包注,文檔是以鍵值對出現的,必須成對設置 > db.user.insert({"uid":1,"name":"luotianshuai","age":18,"salary":1}) WriteResult({ "nInserted" : 1 }) >
2、查詢
#通過find()方法進行查詢 > db.user.find() { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 } >
3、如何快速構造1萬條文檔呢?
可以通過json的循環來實現
> for(i=2;i<=20;i++){ ... db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000}) ... } WriteResult({ "nInserted" : 1 }) >
總結:
插入一條文檔使用insert方法
文檔的規則是鍵值對,他們是成對出現的他們之間用逗號分隔,鍵和值通過冒號分隔。
刪除文檔
1、查詢所有
#db.user.find() 如果括號內不加任何條件那么默認是顯示所有的文檔
2、查詢條件
> db.user.find({"uid":1}) #這里指定條件
{ "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }
3、刪除文檔
> db.user.remove({"uid":1})
WriteResult({ "nRemoved" : 1 }) #當removed為1的時候說明刪除成功
4、清空集合
> db.user.remove({}) WriteResult({ "nRemoved" : 19 })
5、刪除集合
> db.user.drop() true #如果返回true說明刪除成功
更新文檔
先把之前刪除掉餓文檔創建一下:
for(i=2;i<=20;i++){ db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000}) }
1、更新文檔
更新文檔這里通過update方法括號內,第一個文檔為查詢的文檔,第二個文檔為修改為什么文檔!
> db.user.update({"uid":2},{"name":"shuaige"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
通過查看這種更新方式,后面的文檔會覆蓋我們要修改文檔的整個內容,就變成下面的內容了。uid字段salary字段都被覆蓋掉了
> db.user.find() { "_id" : ObjectId("575f068e0c73a5a96e8f7ca3"), "name" : "shuaige" }
所以用下面的方法可以
> db.user.update({"uid":3},{"uid" : 3, "name" : "shuaige", "salary" : 2000 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne({"uid":3})
{
"_id" : ObjectId("575f068e0c73a5a96e8f7ca4"),
"uid" : 3,
"name" : "shuaige",
"salary" : 2000
}
>
可以看到這個更新結果是我們想要的結果,這種方式叫做文檔的替換方式更新!
但是我們uid不需要變更,salary也不需要變更但是我們都要寫出來!
2、變量替換方式
我們可以把取出來的值賦值給一個變量,然后通過變量去修改!
#把查詢到的值賦值給a > a = db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 } > a.name luotianshuai4 #通過變量.字段名去修改字段的內容 > a.name="dashuaige" dashuaige > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 } #然后在通過update更新 > db.user.update({"uid":4},a) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "dashuaige", "salary" : 7000 }
他的本質還是替換的方式,只不過是方便了
3、使用修改器$inc更新
如何對uid為10的用戶增加100塊錢工資
#這里$inc遵循鍵值對的規則,他相當於鍵,要修改的內容為值 > db.user.update({"uid":10},{"$inc":{"salary":100}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7100 } #減100 > db.user.update({"uid":10},{"$inc":{"salary":-100}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000 }
4、添加一個字段$set修改器
有時候有需求要給某個文檔添加一個字段,比如年齡。使用$set
#添加器$set > db.user.update({"uid":10},{"$set":{"age":18}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000, "age" : 18 }
5、刪除一個字段$unset修改器
有時候有需求要求給某個文檔刪除一個字段,比如年齡。使用$unset
#這里注意使用unset的時候他的值也是一個字典要刪除的字段:1 這個1,是true的意思刪除它,所以這個1是邏輯的true > db.user.update({"uid":10},{"$unset":{"age":1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000 }
看上面使用$unset的時候age的值為1說明為true那我們也可以通過值為true來刪除它,那么我們來刪除uid為10的salary字段
#例子 > db.user.update({"uid":10},{"$unset":{"salary":true}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 結果: { "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10" }
6、更新文檔的其他參數
> db.user.update({arg1},{arg2},arg3,arg4) ''' 參數1:條件 #通過他來查找 參數2:需要操作的更新內容 #把找到的文檔修改 參數3: 參宿4: ''' #參數3是做什么呢? 咱們看下下面一種情況: 如果我現在想更新一條數據uid為100,我這里是沒有這個uid為100的文檔的 > db.user.find({"uid":100}) #為空 那么現在我修改他下那么會成功的修改嗎? > db.user.update({"uid":100},{"uid":100,"name":"luotianshuai100","salary":100}) WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 }) #看上面的提示找到0,修改0,說明沒有更新,那么第3個參數的作用就來了,給他設置為true > db.user.update({"uid":100},{"uid":100,"name":"luotianshuai100","salary":100},true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, #當查找不到的時候,我們插入它 "nModified" : 0, "_id" : ObjectId("575f12ee7732f402fffdf61b") }) > #查看下,他更新成功了 { "_id" : ObjectId("575f12ee7732f402fffdf61b"), "uid" : 100, "name" : "luotianshuai100", "salary" : 100 } ''' so 那么第三個參數的含義就展現出來了,如果查找不到條件,那么就插入我們修改的內容 ''' #參數4的含義 現在有個需求我現在需要給所有的員工加10000塊錢,來看下我的操作 > db.user.update({},{"$inc":{"salary":1000}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #可以看到他只更新了匹配到的第一條數據那么,第4個參數的作用就來了 > db.user.update({},{"$inc":{"salary":1000}},false,true) WriteResult({ "nMatched" : 20, "nUpserted" : 0, "nModified" : 20 }) > ''' 從上面可以看出,第四個參數的作用就是設置為true的時候就是匹配所有文檔 '''
總結:
第3個和第4個參數默認為false
第一個為查找的條件,第二個為修改內容,第三個是是否在查不到的時候添加修改內容,第四個是是否匹配所有。
更新文檔中的文檔和更新文檔中的數組
用Python理解的話就是字典中的字典和,字典中的列表~~!
先創建一個文檔,然后通過修改他來實際看下如何修改文檔中的文檔和文檔中的數組
> db.user.insert({"uid":1,"name":"luotianshuai","content":{"addr":"beijing","code":10085,"qq":"1234567"},"email":[]})
WriteResult({ "nInserted" : 1 })
> db.user.findOne()
{
"_id" : ObjectId("575f19c45e4f17980e7b3366"),
"uid" : 1,
"name" : "luotianshuai",
"content" : {
"addr" : "beijing",
"code" : 10085,
"qq" : "1234567"
},
"email" : [ ]
}
>
一、數組的更新
1、數組增加元素$push
> db.user.update({"uid":1},{"$push":{"email":"a"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
"_id" : ObjectId("575f19c45e4f17980e7b3366"),
"uid" : 1,
"name" : "luotianshuai",
"content" : {
"addr" : "beijing",
"code" : 10085,
"qq" : "1234567"
},
"email" : [
"a"
]
}
>
$push 是在元組中增加一個元素,會在數組的最后追加元素
2、$pushAll 在元組中增加多個元素,但是他不檢查元素是否存在
如下:b已經存在了,我再同時增加b,c,d看下是什么結果
> db.user.update({"uid":1},{"$push":{"email":"b"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
"_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
"uid" : 1,
"name" : "luotianshuai",
"content" : {
"addr" : "beijing",
"code" : 10085,
"qq" : "1234567"
},
"email" : [
"a",
"b"
]
}
>
$pushAll
> db.user.update({"uid":1},{"$pushAll":{"email":["b","c","d"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
"_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
"uid" : 1,
"name" : "luotianshuai",
"content" : {
"addr" : "beijing",
"code" : 10085,
"qq" : "1234567"
},
"email" : [
"a",
"b",
"b",
"c",
"d"
]
}
>
3、$addToSet 往數組中添加一個不重復的元素
> db.user.update({"uid":1},{"$addToSet":{"email":"d"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
>
#從上面的結果可以看出匹配到了一個,插入和修改了0個,說明他可以判斷元素是否存在
添加一個元素
#如果不存在就創建 > db.user.update({"uid":1},{"$addToSet":{"email":"e"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) >
添加多個不重復的元素,這時候就得需要用到$eache操作符了
#這里e,d都是存在的然后g,f是不存在的批量插入看下結果 > db.user.update({"uid":1},{"$addToSet":{"email":{"$each":["e","g","f","d"]}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) #結果 > db.user.findOne() { "_id" : ObjectId("575f1b9a5e4f17980e7b3367"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "a", "b", "b", "c", "d", "e", "g", "f" ] } >
總結:
db.user.update({"uid":1},{"$push":{"email":"a"}}) #在數組末尾添加一個元素
db.user.update({"uid":1},{"$pushAll":{"email":["b","c","d"]}}) #在數組末尾添加多個元素,且並不檢查是否重復
db.user.update({"uid":1},{"$addToSet":{"email":"d"}}) #向數組添加一個不重復的元素
#在實際的生產中可能需要插入多個不重復的元素可以使用$addToSet 結合$eache操作符
db.user.update({"uid":1},{"$addToSet":{"email":{"$each":["e","g","f","d"]}}})
二、刪除數組元素
1、$pop 從數組中1個值,只能從開頭和結尾取值
$pop是從數組中的開頭和結尾刪除一個值
從上面的結果可以看出,$pop操作符的值中數組的值,為正數的時候從數組的右側刪值,為負數的時候從數組的左側取值
2、$pull刪除指定的數組指定的一個元素
3、$pullAll 刪除多個指定的數組元素
總結:
db.user.update({"uid":1},{"$pop":{"email":-1}}) #從左側刪除一個元素
db.user.update({"uid":1},{"$pop":{"email":1}})#從右側刪除一個元素
db.user.update({"uid":1},{"$pull":{"email":"b"}}) #刪除數組內的指定一個元素
db.user.update({"uid":1},{"$pullAll":{"email":["b","c"]}}) #刪除數組內指定的多個元素
三、數組元素的更新
1、通過變量調用下標修改
> db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "e" ] } > a = db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "e" ] } > a.email [ "d", "e" ] > a.email[0] d > a.email[1] e > a.email[1] = "shuaige.qq.com" shuaige.qq.com > db.user.update({"uid":1},a) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "shuaige.qq.com" ] } >
2、通過數組.下標修改
> db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "d", "shuaige.qq.com" ] } > db.user.update({"uid":1},{"$set":{"email.0":"tim.qq.com"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } >
上面的emil.0 相當於emil[0] 通過下標調用mongodb能識別它!
四、文檔的文檔修改
看下面的例子說明,文檔的文檔可以通過“.”分法一級一級的嵌套下去修改他如下
1、查詢
> b = db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 10085, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } > b.con b.constructor b.content > b.content { "addr" : "beijing", "code" : 10085, "qq" : "1234567" } > b.content.addr beijing > b.content.addr
2、修改
> b.content.code = 123456789 123456789 > b { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 123456789, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } > db.user.update({"uid":1},b) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne() { "_id" : ObjectId("575f21df5e4f17980e7b3369"), "uid" : 1, "name" : "luotianshuai", "content" : { "addr" : "beijing", "code" : 123456789, "qq" : "1234567" }, "email" : [ "tim.qq.com", "shuaige.qq.com" ] } >
