NoSql簡介
- NoSQL(Not Only SQL ),意即“不僅僅是SQL” ,指的是非關(guān)系型的數(shù)據(jù)庫 拧额。是一項(xiàng)全新的數(shù)據(jù)庫革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢越發(fā)高漲舒憾。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲,相對于鋪天蓋地的關(guān)系型數(shù)據(jù)庫運(yùn)用穗熬,這一概念無疑是一種全新的思維的注入镀迂。
-
關(guān)系型數(shù)據(jù)庫中的表都是存儲一些結(jié)構(gòu)化的數(shù)據(jù),每條記錄的字段的組成都一樣唤蔗,即使不是每條記錄都需要所有的字段探遵,但數(shù)據(jù)庫會為每條數(shù)據(jù)分配所有的字段窟赏。而非關(guān)系型數(shù)據(jù)庫以鍵值對(key-value)存儲,它的結(jié)構(gòu)不固定箱季,每一條記錄可以有不一樣的鍵涯穷,每條記錄可以根據(jù)需要增加一些自己的鍵值對,這樣就不會局限于固定的結(jié)構(gòu)藏雏,可以減少一些時(shí)間和空間的開銷拷况。
常見的NoSql數(shù)據(jù)庫
NOSql數(shù)據(jù)庫的優(yōu)缺點(diǎn)
-
在優(yōu)勢方面主要體現(xiàn)在下面幾點(diǎn):
- 簡單的擴(kuò)展
- 快速的讀寫
- 低廉的成本
- 靈活的數(shù)據(jù)模型
-
在不足方面主要有下面幾點(diǎn):
- 不提供對SQL的支持
- 支持的特性不夠豐富
- 現(xiàn)有的產(chǎn)品不夠成熟
MongoDB簡介
MongoDB是用C++語言編寫的非關(guān)系型數(shù)據(jù)庫。特點(diǎn)是高性能掘殴、易部署赚瘦、易使用,存儲數(shù)據(jù)十分方便杯巨,主要特性有:
- 面向集合存儲蚤告,易于存儲對象類型的數(shù)據(jù)
- 模式自由
- 支持動(dòng)態(tài)查詢
- 支持完全索引,包含內(nèi)部對象
- 支持復(fù)制和故障恢復(fù)
- 使用高效的二進(jìn)制數(shù)據(jù)存儲服爷,包括大型對象
- 文件存儲格式為BSON(一種JSON的擴(kuò)展)
MongoDB基本概念
- 文檔(document)是MongoDB中數(shù)據(jù)的基本單元杜恰,非常類似于關(guān)系型數(shù)據(jù)庫系統(tǒng)中的行(但是比行要復(fù)雜的多)
- 集合(collection)就是一組文檔,如果說MongoDB中的文檔類似于關(guān)系型數(shù)據(jù)庫中的行仍源,那么集合就如同表
- MongoDB的單個(gè)計(jì)算機(jī)可以容納多個(gè)獨(dú)立的數(shù)據(jù)庫心褐,每一個(gè)數(shù)據(jù)庫都有自己的集合和權(quán)限
- MongoDB自帶簡潔但功能強(qiáng)大的JavaScript shell,這個(gè)工具對于管理MongoDB實(shí)例和操作數(shù)據(jù)作用非常大
- 每一個(gè)文檔都有一個(gè)特殊的鍵"_id",它在文檔所處的集合中是唯一的笼踩,相當(dāng)于關(guān)系數(shù)據(jù)庫中的表的主鍵
數(shù)據(jù)庫基本操作
創(chuàng)建一個(gè)數(shù)據(jù)庫
use [databaseName]
注意:使用該命令逗爹,你什么也不干就離開的話這個(gè)空數(shù)據(jù)庫就會被刪除查看所有數(shù)據(jù)庫
show dbs
給指定數(shù)據(jù)庫添加集合并且添加記錄
db.[documentName].insert({...})
查看制定文檔的數(shù)據(jù)
show collections
更新文檔數(shù)據(jù)
db.[documentName].update({查詢條件},{更新內(nèi)容})
例:
var p = db.persons.findOne()
db.persons.update(p,{name:"myNewName"})
-
Shell的help
- 里面的所有的shell可以完成命令幫助
- 全局的help
- 數(shù)據(jù)庫相關(guān)的
db.help()
- 集合相關(guān)的
db.[documentName].help()
- 數(shù)據(jù)庫相關(guān)的
-
數(shù)據(jù)庫和集合命名規(guī)范
- 不能是空字符串
- 不得含有‘ ’(空格)、嚎于,掘而、$、/于购、\袍睡、和\o(空字符)
- 應(yīng)全部小寫
- 最多64字節(jié)
- 數(shù)據(jù)庫名稱不能喝現(xiàn)有系統(tǒng)保留庫同名,如admin,local以及config
- 這樣的集合名字才是合法的
注意:db-text
名字也是合法的肋僧,但是不能通過db.[documentName]
來得到了斑胜,要改為db.getCollection(documentName)
,因?yàn)閐b-text會被當(dāng)做減法操作
- mongoDB的shell內(nèi)置javascript引擎可以直接執(zhí)行js代碼
function insert(object){
db.getCollection("db-text").insert(object)
}
insert({age:12})
- shell可以用eval
db.eval("return 'mongoDB'")
BSON
- BSON是JSON的擴(kuò)展嫌吠,它線增加了諸如日期止潘,浮點(diǎn)燈JSON不支持的數(shù)據(jù)類型
BSON | |
---|---|
null | 用于表示空或者不存在的字段 |
布爾 | 數(shù)值true和false |
32位和64位整數(shù) | Shell不支持 需用到其他高級語言的驅(qū)動(dòng)來完成JS不可使用 |
64位浮點(diǎn) | Shell中使用的數(shù)字其實(shí)全是這種類型{x:3.414}
|
UTF-8 | 其實(shí)就是字符串類型 |
對象ID | 內(nèi)置默認(rèn)ID對象{_id:ObjectId()}
|
日期 | {x:new Date()} |
正則 | {x:/uspcat/i} |
Javascript代碼塊 | {x:function(){...}} |
undefined | 為定義類型注意他和null不是一個(gè)類型 |
數(shù)組 | {gps:[20,56]} |
內(nèi)嵌文檔 | {x:{name:"uspcat"}} |
二進(jìn)制 | 任意字節(jié)的字符串shell中時(shí)無法使用 |
查詢
- 查詢制定文檔的數(shù)據(jù)
- 查詢所有:
db.[documentName].find()
- 查詢指定字段:
db.[documentName].find({age:7},{name:1})
,查詢age=7的name字段 - 查詢第一條數(shù)據(jù):
db.[documentName].findOne()
- 查詢所有:
- 查詢集合中的文檔 辫诅,統(tǒng)計(jì)(count)凭戴、排序(sort)、分頁(skip炕矮、limit)
db.customer.count();
db.customer.find().count();
db.customer.find({age:{$lt:5}}).count();
db.customer.find().sort({age:1}); //降序-1
db.customer.find().skip(2).limit(3);
db.customer.find().sort({age:-1}).skip(2).limit(3);
db.customer.find().sort({age:-1}).skip(2).limit(3).count();
db.customer.find().sort({age:-1}).skip(2).limit(3).count(0);
db.customer.find().sort({age:-1}).skip(2).limit(3).count(1);
$all
查詢集合中的文檔 ,$all主要用來查詢數(shù)組中的包含關(guān)系簇宽,查詢條件中只要有一個(gè)不包含就不返回
> db.c1.find()
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3ac3f22715cddac80dea"), "name" : "zhangguorong", "age" : [ 1, 38, 12, 77 ] }
{ "_id" : ObjectId("599d3b95f22715cddac80deb"), "name" : "zhangguorong", "age" : [ 1, 24, 12, 77 ] }
> db.c1.find({age:{$all:[1,24]}})
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3b95f22715cddac80deb"), "name" : "zhangguorong", "age" : [ 1, 24, 12, 77 ] }
>
$in
查詢集合中的文檔 ,$in勋篓,類似于關(guān)系型數(shù)據(jù)庫中的IN
> db.c1.find()
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3ac3f22715cddac80dea"), "name" : "zhangguorong", "age" : [ 1, 38, 12, 77 ] }
{ "_id" : ObjectId("599d3b95f22715cddac80deb"), "name" : "zhangguorong", "age" : [ 1, 24, 12, 77 ] }
> db.c1.find({age:{$in:[1,21,24]}})
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3ac3f22715cddac80dea"), "name" : "zhangguorong", "age" : [ 1, 38, 12, 77 ] }
{ "_id" : ObjectId("599d3b95f22715cddac80deb"), "name" : "zhangguorong", "age" : [ 1, 24, 12, 77 ] }
>
$nin
查詢集合中的文檔 ,$nin,與$in相反
and條件查詢
> db.c1.find({name:"xiaoxi",age:21})
{ "_id" : ObjectId("599d3cb5f22715cddac80dec"), "name" : "xiaoxi", "age" : 21 }
> db.c1.find({name:"xiaoxi",name:"xiaodong"}) //and條件都是name時(shí)魏割,最后一個(gè)name生效
{ "_id" : ObjectId("599d3cc1f22715cddac80ded"), "name" : "xiaodong", "age" : 22 }
>
$or
查詢集合中的文檔 ,$or譬嚣,相當(dāng)于關(guān)系型數(shù)據(jù)庫中的OR,表示或者的關(guān)系钞它,例如查詢name為xiaoxi或者name為xiaodong的文檔拜银,命令為:
> db.c1.find()
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3ac3f22715cddac80dea"), "name" : "zhangguorong", "age" : [ 1, 38, 12, 77 ] }
{ "_id" : ObjectId("599d3b95f22715cddac80deb"), "name" : "zhangguorong", "age" : [ 1, 24, 12, 77 ] }
{ "_id" : ObjectId("599d3cb5f22715cddac80dec"), "name" : "xiaoxi", "age" : 21 }
{ "_id" : ObjectId("599d3cc1f22715cddac80ded"), "name" : "xiaodong", "age" : 22 }
{ "_id" : ObjectId("599d3ccbf22715cddac80dee"), "name" : "xiaonan", "age" : 23 }
{ "_id" : ObjectId("599d3cd4f22715cddac80def"), "name" : "xiaobei", "age" : 24 }
> db.c1.find({$or:[{name:"xiaoxi"},{name:"xiaodong"}]})
{ "_id" : ObjectId("599d3cb5f22715cddac80dec"), "name" : "xiaoxi", "age" : 21 }
{ "_id" : ObjectId("599d3cc1f22715cddac80ded"), "name" : "xiaodong", "age" : 22 }
>
$nor
查詢集合中的文檔 ,$nor,表示根據(jù)條件過濾掉某些數(shù)據(jù)遭垛,例如查詢name不是user2尼桶,age不是3的文檔,命令為:
db.customer.find({$nor:[{name:”user2”},{age:3}]})
> db.c1.find()
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3ac3f22715cddac80dea"), "name" : "zhangguorong", "age" : [ 1, 38, 12, 77 ] }
{ "_id" : ObjectId("599d3b95f22715cddac80deb"), "name" : "zhangguorong", "age" : [ 1, 24, 12, 77 ] }
{ "_id" : ObjectId("599d3cb5f22715cddac80dec"), "name" : "xiaoxi", "age" : 21 }
{ "_id" : ObjectId("599d3cc1f22715cddac80ded"), "name" : "xiaodong", "age" : 22 }
{ "_id" : ObjectId("599d3ccbf22715cddac80dee"), "name" : "xiaonan", "age" : 23 }
{ "_id" : ObjectId("599d3cd4f22715cddac80def"), "name" : "xiaobei", "age" : 24 }
> db.c1.find({$nor:[{name:"zhangguorong"},{name:"xiaoxi"},{age:22}]})
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3ccbf22715cddac80dee"), "name" : "xiaonan", "age" : 23 }
{ "_id" : ObjectId("599d3cd4f22715cddac80def"), "name" : "xiaobei", "age" : 24 }
$exits
查詢集合中的文檔 ,$exists锯仪,用于查詢集合中存在某個(gè)鍵的文檔或不存在某個(gè)鍵的文檔泵督,例如查詢customer集合中存在name鍵的所有文檔,可以使用 db.customer.find({name:{$exists:1}})
庶喜,
$exists:1表示真小腊,指存在
$exists:0表示假,指不存在
> db.c2.find()
{ "_id" : ObjectId("599d40f1b63c48182175b59f"), "name" : "wangzhaoting", "desc" : "ydh" }
{ "_id" : ObjectId("599d4103b63c48182175b5a0"), "name" : "wangzhaoting", "age" : 24 }
> db.c2.find({age:{$exists:1}})
{ "_id" : ObjectId("599d4103b63c48182175b5a0"), "name" : "wangzhaoting", "age" : 24 }
> db.c2.find({name:{$exists:1}})
{ "_id" : ObjectId("599d40f1b63c48182175b59f"), "name" : "wangzhaoting", "desc" : "ydh" }
{ "_id" : ObjectId("599d4103b63c48182175b5a0"), "name" : "wangzhaoting", "age" : 24 }
>
游標(biāo)
查詢集合中的文檔 久窟,類似于關(guān)系型數(shù)據(jù)庫秩冈,mongodb中也有游標(biāo)的概念
> db.c1.find()
{ "_id" : ObjectId("599d3aacf22715cddac80de9"), "name" : "zhangxueyou", "age" : [ 1, 21, 24, 88 ] }
{ "_id" : ObjectId("599d3ac3f22715cddac80dea"), "name" : "zhangguorong", "age" : [ 1, 38, 12, 77 ] }
{ "_id" : ObjectId("599d3b95f22715cddac80deb"), "name" : "zhangguorong", "age" : [ 1, 24, 12, 77 ] }
{ "_id" : ObjectId("599d3cb5f22715cddac80dec"), "name" : "xiaoxi", "age" : 21 }
{ "_id" : ObjectId("599d3cc1f22715cddac80ded"), "name" : "xiaodong", "age" : 22 }
{ "_id" : ObjectId("599d3ccbf22715cddac80dee"), "name" : "xiaonan", "age" : 23 }
{ "_id" : ObjectId("599d3cd4f22715cddac80def"), "name" : "xiaobei", "age" : 24 }
> var d = db.c1.find()
> d.hasNext()
true
> d.next()
{
"_id" : ObjectId("599d3aacf22715cddac80de9"),
"name" : "zhangxueyou",
"age" : [
1,
21,
24,
88
]
}
> d.next()
{
"_id" : ObjectId("599d3ac3f22715cddac80dea"),
"name" : "zhangguorong",
"age" : [
1,
38,
12,
77
]
}
>
插入
- 插入文檔
db.[documentName].insert({})
- 批量插入文檔
- shell 這樣執(zhí)行是錯(cuò)誤的
db.[documentName].insert([{},{},{},……..])
,shell 不支持批量插入 - 想完成批量插入可以用mongo的應(yīng)用驅(qū)動(dòng)或是shell的for循環(huán)
- shell 這樣執(zhí)行是錯(cuò)誤的
for(var i=0;i<10;i++){
db.persons.insert({name:"name"+i,age:20+i})
}
- Save操作
save操作和insert操作區(qū)別在于當(dāng)遇到_id相同的情況下斥扛,save完成保存操作入问,insert則會報(bào)錯(cuò)
刪除
刪除文檔中的數(shù)據(jù)
db.[documentName].remove({..})
例:db.persons.remove({name:"myNewName"})
刪除庫中的集合
db.[documentName].drop()
刪除數(shù)據(jù)庫
db.dropDatabase()
刪除列表中所有數(shù)據(jù)
db.[documentName].remove()
集合的本身和索引不會被刪除根據(jù)條件刪除
db.[documentName].remove({})
刪除集合text中name等于uspcat的紀(jì)錄
db.text.remove({name:”uspcat”})
小技巧
如果你想清楚一個(gè)數(shù)據(jù)量十分龐大的集合
直接刪除該集合并且重新建立索引的辦法
比直接用remove的效率和高很多
更新
db.collection.update(criteria,objNew,upsert,multi)
- 參數(shù)說明:
- criteria:用于設(shè)置查詢條件的對象
- objNew:用于設(shè)置更新內(nèi)容的對象
- upsert:如果記錄已經(jīng)存在,更新它稀颁,否則新增一個(gè)記錄芬失,取值為0或1
- multi:如果有多個(gè)符合條件的記錄,是否全部更新匾灶,取值為0或1
注意:默認(rèn)情況下麸折,只會更新第一個(gè)符合條件的記錄
一般情況下后兩個(gè)參數(shù)分別為0,1 ,即:db.collection.update(criteria,objNew,0,1)
- 強(qiáng)硬的文檔替換式更新操作
db.[documentName].update({查詢器},{修改器})
強(qiáng)硬的更新會用新的文檔代替老的文檔
- 主鍵沖突的時(shí)候會報(bào)錯(cuò)并且停止更新操作
因?yàn)槭菑?qiáng)硬替換當(dāng)替換的文檔和已有文檔ID沖突的時(shí)候粘昨,則系統(tǒng)會報(bào)錯(cuò)
例:db.persons.update({_id:2},{_id:3,name:"haha"})
-
insertOrUpdate
操作
目的:查詢器查出來數(shù)據(jù)就執(zhí)行更新操作,查不出來就替換操作
做法:db.[documentName].update({查詢器},{修改器},true)
- 批量更新操作
默認(rèn)情況當(dāng)查詢器查詢出多條數(shù)據(jù)的時(shí)候默認(rèn)就修改第一條數(shù)據(jù)
如何實(shí)現(xiàn)批量修改
db.[documentName].update({查詢器},{修改器},false, true)
- 第三個(gè)參數(shù):false,表示不執(zhí)行insert操作
- 第四個(gè)參數(shù):true窜锯,表示進(jìn)行批量操作
修改器
使用修改器來完成局部更新操作
- 數(shù)組定位器,如果數(shù)組有多個(gè)數(shù)值我們只想對其中一部分進(jìn)行操作我們就要用到定位器($)
例子:
例如有文檔
{name:”YFC”,age:27,books:[{type:’JS’,name:”EXTJS4”},{type:”JS”,name:”JQUERY”},{type:”DB”,name:”MONGODB”}]}
我們要把type等于JS的文檔增加一個(gè)相同的作者author是USPCAT
辦法:
db.text.update({"books.type":"JS"},{$set:{"books.$.author":"USPCAT"}})
- 切記修改器是放到最外面,后面要學(xué)的查詢器是放到內(nèi)層的
案例
- $set
db.persons.update({name:"name0"},{$set:{gender:"man"}})
- $inc
db.persons.update({age:20},{$inc:{age:10}})
- $unset
db.persons.update({age:30},{$unset:{gender:"man"}})
- $push
db.persons.insert({name:"myname",age:28,book:[]})
db.persons.update({name:"myname"},{$push:{book:"js"}})
db.persons.update({name:"myname"},{$push:{book:"extjs4"}})
- $pushAll
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1" }
{ "_id" : 2, "name" : "name2" }
> db.persons.update({_id:2},{$pushAll:{book:["js","jquery"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1" }
{ "_id" : 2, "name" : "name2", "book" : [ "js", "jquery" ] }
>
- $addToSet
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1" }
> db.persons.update({_id:1},{$addToSet:{codes:"classs"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "classs" ] }
> db.persons.update({_id:1},{$addToSet:{codes:"var"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "classs", "var" ] }
> db.persons.update({_id:1},{$addToSet:{codes:"var"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "classs", "var" ] }
>
- $pop
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "classs", "var", "project" ] }
> db.persons.update({_id:1},{$pop:{codes:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "var", "project" ] }
> db.persons.update({_id:1},{$pop:{codes:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "var" ] }
>
- $pull
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "var", "js", "extjs" ] }
> db.persons.update({_id:1},{$pull:{codes:"var"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "js", "extjs" ] }
>
- $pullAll
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ "js", "extjs" ] }
> db.persons.update({_id:1},{$pullAll:{codes:["js","extjs"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ ] }
>
- $
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ ] }
> db.persons.insert({_id:2,name:"name2",books:[{type:"JS",name:"jsgj"},{type:"JS",name:"jquery"},{type:"DB",name:"mongoDB"}]})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ ] }
{ "_id" : 2, "name" : "name2", "books" : [ { "type" : "JS", "name" : "jsgj" }, { "type" : "JS", "name" : "jquery" }, { "type" : "DB", "name" : "mongoDB" } ] }
> db.persons.update({"books.type":"JS"},{$set:{"books.$.author":"uspcat"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1", "codes" : [ ] }
{ "_id" : 2, "name" : "name2", "books" : [ { "type" : "JS", "name" : "jsgj", "author" : "uspcat" }, { "type" : "JS", "name" : "jquery" }, { "type" : "DB", "name" : "mongoDB" } ] }
>
數(shù)組批量更新
- $addToSet與$each結(jié)合完成批量數(shù)組更新
db.text.update({_id:1000},{$addToSet:{books:{$each:[“JS”,”DB”]}}})
$each
會循環(huán)后面的數(shù)組把每一個(gè)數(shù)值進(jìn)行$addToSet
操作 - 存在分配與查詢效率
當(dāng)document被創(chuàng)建的時(shí)候DB為其分配沒存和預(yù)留內(nèi)存當(dāng)修改操作
不超過預(yù)留內(nèi)層的時(shí)候則速度非痴派觯快反而超過了就要分配新的內(nèi)存,則會消耗時(shí)間
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1" }
{ "_id" : 2, "name" : "name2", "books" : [ ] }
> db.persons.update({_id:2},{$set:{books:["js"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1" }
{ "_id" : 2, "name" : "name2", "books" : [ "js" ] }
> db.persons.update({_id:2},{$addToSet:{books:{$each:["js","DB","java"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 0, "name" : "name0" }
{ "_id" : 1, "name" : "name1" }
{ "_id" : 2, "name" : "name2", "books" : [ "js", "DB", "java" ] }
>
- runCommand函數(shù)和findAndModify函數(shù)
runCommand可以執(zhí)行mongoDB中的特殊函數(shù)
findAndModify就是特殊函數(shù)之一锚扎,他的作用是返回update或remove后的文檔
runCommand({“findAndModify”:”processes”,
query:{查詢器},
sort{排序},
new:true
update:{更新器},
remove:true
}).value
ps = db.runCommand({
"findAndModify":"persons",
"query":{"name":"text"},
"update":{"$set":{"email":"1221"}},
"new":true
}).value
do_something(ps)