MongoDB【第三篇】MongoDB基本操做

MongoDB的基本操做包括文檔的建立、刪除、和更新mongodb

文檔插入

一、插入數據庫

#查看當前都有哪些數據庫
> 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 })
> 

二、查詢json

#經過find()方法進行查詢
> db.user.find()
{ "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }
> 

三、如何快速構造1萬條文檔呢?數組

能夠經過json的循環來實現dom

> for(i=2;i<=20;i++){
... db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000})
... }
WriteResult({ "nInserted" : 1 })
> 

總結:ui

插入一條文檔使用insert方法spa

文檔的規則是鍵值對,他們是成對出現的他們之間用逗號分隔,鍵和值經過冒號分隔。code

刪除文檔

一、查詢全部blog

#db.user.find() 若是括號內不加任何條件那麼默認是顯示全部的文檔

二、查詢條件rem

> db.user.find({"uid":1}) #這裏指定條件
{ "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }

三、刪除文檔

> db.user.remove({"uid":1})
WriteResult({ "nRemoved" : 1 })  #當removed爲1的時候說明刪除成功

四、清空集合

> db.user.remove({})
WriteResult({ "nRemoved" : 19 })

五、刪除集合

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

一、更新文檔

更新文檔這裏經過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也不須要變動可是咱們都要寫出來!

二、變量替換方式

咱們能夠把取出來的值賦值給一個變量,而後經過變量去修改!

#把查詢到的值賦值給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
}

他的本質仍是替換的方式,只不過是方便了

三、使用修改器$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 }

四、添加一個字段$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 }

五、刪除一個字段$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" }

六、更新文檔的其餘參數

> 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 是在元組中增長一個元素,會在數組的最後追加元素

二、$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"
        ]
}
> 

三、$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"]}}})

2、刪除數組元素

一、$pop 從數組中1個值,只能從開頭和結尾取值

$pop是從數組中的開頭和結尾刪除一個值

從上面的結果能夠看出,$pop操做符的值中數組的值,爲正數的時候從數組的右側刪值,爲負數的時候從數組的左側取值

二、$pull刪除指定的數組指定的一個元素

三、$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"]}}) #刪除數組內指定的多個元素

3、數組元素的更新

一、經過變量調用下標修改

> 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"
        ]
}
> 

二、經過數組.下標修改

> 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能識別它!

4、文檔的文檔修改

看下面的例子說明,文檔的文檔能夠經過「.」分法一級一級的嵌套下去修改他以下

一、查詢

> 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 

二、修改

> 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"
        ]
}
> 
相關文章
相關標籤/搜索