09

1.安裝mongodb nodejs driver

要安裝mongodb nodejs的原生driver,可以通過npm,也可以通過github下載:

npm install mongodb

2連接到數(shù)據(jù)庫

var mongo = require('mongodb'),

Server = mongo.Server,

Db = mongo.Db;

var server = new Server('localhost', 27017, {auto_reconnect: true});

var db = new Db('foo', server);

db.open(function(err, db) {

if(!err) {

console.log("We are connected");

}

});

查詢Get

db.open(function(err, db) {

if(!err) {

console.log("We are connected");

db.collection('bar', function(err, collection){

collection.find().toArray(function(error, bars){console.log(bars);});

collection.find({a:1}).toArray(function(error, bars){console.log(bars);});

collection.findOne({a: 1}, function(error, bar){console.log(bar)});

});

}

});

這里一旦用find獲取到結果集之后捉超,需要調(diào)用toArray方法,并傳遞回調(diào)函數(shù)唯绍,這個時候才能拿到真正的數(shù)據(jù)拼岳。第二個find語句則是查找所有a=1的文檔。第三個find語句則是只找第一個滿足條件的文檔况芒。具體更多的過濾條件可以參考官方的Query語句惜纸。這里有個有趣的事情需要注意,find本身并不執(zhí)行查詢绝骚,它只是返回一個Cursor實例耐版,你可以遍歷這個Cursor來查詢數(shù)據(jù)。如下面的例子:

// Cursors don't run their queries until you actually attempt to retrieve data

// from them.

// Find returns a Cursor, which is Enumerable. You can iterate:

collection.find(function(err, cursor) {

cursor.each(function(err, item) {

if(item != null) console.dir(item);

});

});

// You can turn it into an array

collection.find(function(err, cursor) {

cursor.toArray(function(err, items) {

console.log("count: " + items.length);

});

});

插入Insert

db.open(function(err, db) {

if(!err) {

db.collection('bar', function(err, collection) {

var doc1 = {a: 1};

var doc2 = {a: 2, b: 'b2'};

var docs = [{a:3}, {a:4}];

collection.insert(doc1);

collection.insert(doc2, {safe:true}, function(err, result) {});

collection.insert(docs, {safe:true}, function(err, result) {});

});

}

});

第一個insert和第二個insert的區(qū)別在于压汪,增加了一個option對象參數(shù)({safe:true})以及一個回調(diào)函數(shù)粪牲。MongoDB的

insert/update/remove都是異步的,也就是說發(fā)出insert命令之后止剖,就不管數(shù)據(jù)庫是否執(zhí)行成功了腺阳。要想知道數(shù)據(jù)庫是否執(zhí)行成功,需

要再發(fā)出一個查詢請求來獲取連接(Connection)的最后一個錯誤狀態(tài)穿香。為了簡化這個過程亭引,也就支持{safe:true}這個參數(shù),使得

insert和錯誤狀態(tài)查詢能夠一起執(zhí)行,一旦設置這個參數(shù)皮获,一定要增加回調(diào)函數(shù)作為第三個參數(shù)焙蚓。具體地,我們可以看下面地例子來理解這個

{safe:true}的意義:

db.collection('bar', function(err, collection){

collection.insert({a:996, _id:'1'}, function(error, bars){

console.log('insert success without safe');

console.log(error);

console.log(bars);

collection.insert({a:996, _id:'1'}, {safe:true}, function(error, bars){

console.log('insert fail with safe and get error');

console.log(error);

console.log(bars);

collection.insert({a:996, _id:'1'}, function(error, bars){

console.log('insert fail without safe but no error');

console.log(error);

console.log(bars);

});

});

});

});

# output result

[app.js] insert success without safe

[app.js] null

[app.js] [ { a: 996, _id: '1' } ]

[app.js] insert fail with safe and get error

[app.js] { [MongoError: E11000 duplicate key error index: foo.bar.$_id_ ?dup key: { : "1" }]

name: 'MongoError',

err: 'E11000 duplicate key error index: foo.bar.$_id_ ?dup key: { : "1" }',

code: 11000,

n: 0,

connectionId: 38,

ok: 1 }

[app.js] undefined

[app.js] insert fail without safe but no error

[app.js] null

[app.js] [ { a: 996, _id: '1' } ]

這里的_id是mongodb默認的主鍵,是不允許重復的购公。如果你傳入了_id則以傳入的值作為主鍵赵哲,如果沒有傳入則會自動生成。你可以看到君丁,第一次insert枫夺,我們也不關心是不是真的插入了,幸運的是真的成功了绘闷,因為不存在_id為1的數(shù)據(jù)橡庞。第二次插入的時候,我們設置{safe:true}以確保一定插入成功印蔗,這是會報主鍵重復的錯誤扒最。第三次同樣的插入,但是不設置{safe:true}华嘹,這個時候發(fā)現(xiàn)并沒有報錯吧趣,而且回調(diào)函數(shù)還拿到了要插入的數(shù)據(jù)。是不是第三次插入成功了呢耙厚?不是的强挫,其實正像第二次插入的一樣,肯定是主鍵重復了薛躬,但是由于我們并沒有要求返回最后的錯誤狀態(tài)俯渤,所以mongodb drvier直接回調(diào)了我們傳入的回調(diào)函數(shù),并且設置error為null型宝,bars為要插入的數(shù)據(jù)八匠。總結一下趴酣,如果你要確保數(shù)據(jù)是否更新(insert/update/remove)成功必須要設置{safe:true}選項梨树。

更新Update

collection.update({a:996}, {$push: {b:'b'}}, function(error, bars){});

collection.update({a:996}, {$set: {a:997}}, function(error, bars){});

注意,這里為了代碼簡單岖寞,我們沒有設置{safe:true}抡四。你可以看到update的第一個參數(shù)是條件,即對a=996的文檔進行更新慎璧。第二個參數(shù)則

是表示要如何更新文檔床嫌,譬如第一個update是增加一個屬性b,且設置其值為字符串'b'胸私;第二個update是修改a的值為997厌处。可以看出岁疼,第二個

參數(shù)是一個對象阔涉,其屬性名是一個操作符缆娃,以$開頭,值為一個對象瑰排。這些操作符除了這里的$push和$set贯要,還有其它的$inc, $unset,

$pushAll等等,具體可以參考這里椭住。

刪除Delete

collection.remove({a:997}, {safe:true}, function(error, count){

console.log(error);

console.log(count);

collection.remove();

});

這里第一個remove是刪除a=997的所有文檔崇渗。回調(diào)函數(shù)的第二個參數(shù)是表示相應刪除的文檔數(shù)量京郑。第二個remove則是刪除該collection中的所有文檔宅广。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市些举,隨后出現(xiàn)的幾起案子跟狱,更是在濱河造成了極大的恐慌,老刑警劉巖户魏,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶臊,死亡現(xiàn)場離奇詭異,居然都是意外死亡叼丑,警方通過查閱死者的電腦和手機关翎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幢码,“玉大人笤休,你說我怎么就攤上這事≈⒏保” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵政基,是天一觀的道長贞铣。 經(jīng)常有香客問我,道長沮明,這世上最難降的妖魔是什么辕坝? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮荐健,結果婚禮上酱畅,老公的妹妹穿的比我還像新娘。我一直安慰自己江场,他們只是感情好纺酸,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著址否,像睡著了一般餐蔬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天樊诺,我揣著相機與錄音仗考,去河邊找鬼。 笑死词爬,一個胖子當著我的面吹牛秃嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顿膨,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼锅锨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虽惭?” 一聲冷哼從身側響起橡类,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芽唇,沒想到半個月后顾画,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡匆笤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年研侣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炮捧。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡庶诡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咆课,到底是詐尸還是另有隱情末誓,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布书蚪,位于F島的核電站喇澡,受9級特大地震影響,放射性物質發(fā)生泄漏殊校。R本人自食惡果不足惜晴玖,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望为流。 院中可真熱鬧呕屎,春花似錦、人聲如沸敬察。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静汤。三九已至琅催,卻和暖如春居凶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藤抡。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工侠碧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缠黍。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓弄兜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓷式。 傳聞我的和親對象是個殘疾皇子替饿,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

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

  • 1.安裝mongodb nodejs driver 要安裝mongodb nodejs的原生driver,可以通過...
    安宗奇閱讀 433評論 0 0
  • 今天將近期的學習得失進行梳理贸典。有一個清晰現(xiàn)狀视卢,方便后續(xù)的執(zhí)行與改進。 得: 1)三件事及反思寫作廊驼。思考力据过,學習力,...
    暖暖的大樹閱讀 258評論 2 0
  • 一.氛圍 1.人物走動的時候妒挎,周圍都是黑的绳锅,只有人物周圍才能輕微的看到≡脱冢——未知的恐懼鳞芙。 2. 二.情節(jié) 1.開頭...
    AriseLu閱讀 441評論 0 0