1. 程式人生 > >MongoDB---基本操作

MongoDB---基本操作

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

新增多個不重複的元素,這時候就得需要用到$each操作符了

複製程式碼
#這裡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"
        ]
}
> 
複製程式碼

 

 

文件插入

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

新增多個不重複的元素,這時候就得需要用到$each操作符了

複製程式碼
#這裡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"
        ]
}
> 
複製程式碼