2016,9.20mongodb與node.js的合作

1.安裝mongodb nodejs driver

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

npm install mongodb

2連接到數據庫

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獲取到結果集之后,需要調用toArray方法,并傳遞回調函數,這個時候才能拿到真正的數據。第二個find語句則是查找所有a=1的文檔。第三個find語句則是只找第一個滿足條件的文檔。具體更多的過濾條件可以參考官方的Query語句。這里有個有趣的事情需要注意,find本身并不執行查詢,它只是返回一個Cursor實例,你可以遍歷這個Cursor來查詢數據。如下面的例子:

// 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的區別在于,增加了一個option對象參數({safe:true})以及一個回調函數。MongoDB的

insert/update/remove都是異步的,也就是說發出insert命令之后,就不管數據庫是否執行成功了。要想知道數據庫是否執行成功,需

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

insert和錯誤狀態查詢能夠一起執行,一旦設置這個參數,一定要增加回調函數作為第三個參數。具體地,我們可以看下面地例子來理解這個

{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的數據。第二次插入的時候,我們設置{safe:true}以確保一定插入成功,這是會報主鍵重復的錯誤。第三次同樣的插入,但是不設置{safe:true},這個時候發現并沒有報錯,而且回調函數還拿到了要插入的數據。是不是第三次插入成功了呢?不是的,其實正像第二次插入的一樣,肯定是主鍵重復了,但是由于我們并沒有要求返回最后的錯誤狀態,所以mongodb drvier直接回調了我們傳入的回調函數,并且設置error為null,bars為要插入的數據。總結一下,如果你要確保數據是否更新(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的第一個參數是條件,即對a=996的文檔進行更新。第二個參數則

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

參數是一個對象,其屬性名是一個操作符,以$開頭,值為一個對象。這些操作符除了這里的$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的所有文檔。回調函數的第二個參數是表示相應刪除的文檔數量。第二個remove則是刪除該collection中的所有文檔。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容