01_NoSql和mongoDB

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()
  • mongoDB的API
    所有文檔
    js版3.3.4

  • 數(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)
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)

http://www.cppblog.com/byc/archive/2011/07/15/151063.aspx

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吞瞪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驾孔,更是在濱河造成了極大的恐慌芍秆,老刑警劉巖惯疙,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妖啥,居然都是意外死亡霉颠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門荆虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒿偎,“玉大人,你說我怎么就攤上這事怀读∷呶唬” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵菜枷,是天一觀的道長苍糠。 經(jīng)常有香客問我,道長啤誊,這世上最難降的妖魔是什么岳瞭? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮坷衍,結(jié)果婚禮上寝优,老公的妹妹穿的比我還像新娘。我一直安慰自己枫耳,他們只是感情好乏矾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迁杨,像睡著了一般钻心。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铅协,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天捷沸,我揣著相機(jī)與錄音,去河邊找鬼狐史。 笑死痒给,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骏全。 我是一名探鬼主播苍柏,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姜贡!你這毒婦竟也來了试吁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤楼咳,失蹤者是張志新(化名)和其女友劉穎熄捍,沒想到半個(gè)月后烛恤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡余耽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年缚柏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宾添。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡船惨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缕陕,到底是詐尸還是另有隱情粱锐,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布扛邑,位于F島的核電站怜浅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔬崩。R本人自食惡果不足惜恶座,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沥阳。 院中可真熱鬧跨琳,春花似錦、人聲如沸桐罕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽功炮。三九已至溅潜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薪伏,已是汗流浹背滚澜。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫁怀,地道東北人设捐。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像塘淑,于是被迫代替她去往敵國和親萝招。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容