MongoDB + node-mongoskin學習筆記

來源:互聯網
上載者:User

特點
無模式MongoDB 中的每一條文檔,都是一個 JSON 對象,因此你無需預定義一個集合的結構,集合中的每個文檔也可以有不同的結構。

非同步寫入MongoDB 預設所有的寫操作都是『不安全』的,即當請求被 MongoDB 收到時,不等寫入操作完成,就返回一個『成功』的響應。 這是預設的行為,當然你設定一些選項,讓操作等待等待寫入完成後再返迴響應。不過對於大多數應用,這種『不安全』已經足夠安全了。

簡單查詢MongoDB 只支援簡單的查詢,MongoDB 只儲存資料,更多的邏輯應該在應用中解決。因此 MongoDB 有著簡單的且在各程式設計語言下高度一致的 API 介面。

無需營運MongoDB 幾乎沒有什麼選項可以設定,叢集也是設定一次之後就可以自動地解決故障,極少需要維護。

安裝和備份運行 mongod 啟動資料庫,運行 mongo 啟動用戶端 Shell,。

MongoDB 被設計運行於 64bit 的作業系統,在 32bit 的情況下,資料檔案最大限制為 2GiB.


MongoDB 在運行時並不會即時地將修改寫入磁碟,因此在關閉伺服器時需要給 MongoDB 時間將所有資料寫入磁碟。當出現伺服器突然掉電的情況時,MongoDB 的資料庫檔案會損壞,需要進行修複才能重新運行,這個過程中會丟失掉電時進行中的寫入操作。在對運行中的 MongoDB 進行備份時,需要使用內建的 mongodump 工具,不能直接複製其資料庫檔案。



設計文檔結構
ObjectIDMongoDB 會為每一個文檔預設添加一個名為 _id, 類型為 Object 的欄位,這個欄位用來唯一地標識每一個文檔。這個 ID 通過時間,伺服器,進程號被產生,甚至可以認為是全世界唯一的。
除了 MongoDB 預設為 _id 添加 ObjectID, 你也可以自己在文檔中建立 ObjectID, 來起到唯一地標識某個對象的功能。

查詢和更新所謂『增刪查改』在 MongoDB 裡對應:
find/findOne: 查詢
update/save: 修改
insert/save: 新增
remove: 刪除

在 MongoDB 中,操作符以 $ 開頭,主要分為三類:查詢操作符,更新操作符,彙總查詢操作符。

查詢操作符用於 find 和 update 中的查詢器,如 $gt(大於), $ne(不等於), $in(匹配幾個值之一), 邏輯運算:$and, $not。

更新操作符用於 update 中的更新器,如 $inc(對數字進行增量), $set(修改文檔的一部分), $unset(刪除一個欄位).
MongoDB 對嵌入式的文檔和數組有非常好的支援:$addToSet(向集合中添加元素), $push(向數組添加元素), $pull(從數組移除元素).

彙總查詢(Aggregation)類似於 SQL 資料庫中的 GROUP, 提供統計和計算的功能,要多強大有多強大,畢竟可以直接在資料庫中運行 JavaScript 代碼,不過因為效能的關係,不適合在應用中頻繁調用。

查詢命令還有幾個選項limit: 限制返回的結果數
skip: 跳過一些結果
sort: 對結果進行排序
fields: 只返回指定的欄位



MongoDB可以方便的把一些本來MySQL需要通過一對多關聯性關聯的資料通過數組+對象的方式作為一個文檔儲存到一個Collections裡面,並且提供了各種API支援對一個文檔裡面的數組進行操作。
  

MongoDB常用查詢方法與在node中的體現:  


1、資料庫連接 MongoDB:mongo -u username -p password host:port/dbs 
Node+MongoSkin: require(“mongoskin”).db(username:password@host:port/dbs);  

2、索引

person.ensureIndex({“name”:1},{“unique”:true}, callback);

第一個參數是selector,第二個參數是選項,有unique(唯一索引)等mongoDB索引選項。
ensureIndex先尋找是否存在這個索引,如果不存在,則建立索引,因此不會出現重複建立的情況。

3、建立/增加資料person.save({“name”:”jobs”, age:32, gender:”male”}, callback);
person.save({“name”:”tim”, age:29, gender:”male”}, callback);

db.集合名.insert({name:'xiaoxiao',age:2},function(error,result){}

4、查詢

findOne方法:查詢符合selector條件的結果,取第一條給callBack,err是錯誤資訊,如果沒有錯誤,則為undefined,data資料為一個JS對象。 

person.findOne({“name“:”jobs”}), callBack(err, data));  

find方法:查詢符合selector條件,並且還可以加入一系列參數,最後通過toArray方法,把資料產生數組的方式傳遞給callback。 
person.find({“gender”:”male”},{sort:[['name', 1]],skip:pageNum*(page-1), limit:pageNum}).toArray(callback(err, data){}) ;
同時查詢的時候可以通過$in,$gt,$lt等方式來確定selector的範圍。  

$ne:不等於;
personCollection.find({age:{$ne:'2'}},function(error,result){}
$in:某值是否在此指定的範圍,後面一般指定一個範圍數組,數組裡面值的類型可以不相同;
personCollection.find({age:{$in:['2','3','4','5']}},function(error,result){}
$nin:表示不在某個數組範圍裡;
personCollection.find({age:{$lte:'3'}},function(error,result){}
$lt,、$lte、$gt、$gte:分別代表 <, <=,>, >=,它們是用來設定查詢範圍;
$or:也是指定一個範圍來使用,但與上面最大的差別在於,$in 、$nin 有且只有一個數組範圍,而 $or 則可以是多個數組範圍內滿足條件;
personCollection.find({$or:[{name:'王二小'},{age:'2'}]},function(error,result){}

5、更新

有兩點要注意:

[1]、update方法如果是要更新文檔中的一個或幾個屬性的時候,必須要用形如{$set:{age:33}}的形式,如果寫成{age:33}的形式,則這個文檔的其他內容都會被刪除,只剩{age:32}這一個屬性。 
[2]、update方法預設是只更新找到的第一個文檔,如果需要所有的文檔都更新,則需要在option部分再加上{multi:true},如果想要在尋找不到這條記錄的時候新增一條,則要在option部分加上{upsert:true}。 
person.update({“name”:”jobs”}, {$set{“age”:33}}, {multi:true}, callback(err))  
[3]、$inc按步長增加,比如給 age 欄位增加1。
personCollection.findAndModify({_id:'1111111'},[],{$inc:{age:1}},{new:true,upset:true},function(error,result){}

6、刪除 

person.remove({“name”:”jobs”},callback(err){});  


7、selector中使用MongoDB自動產生的_idMongoDB會為每一個文檔產生一個_id屬性,類似於MySQL的主鍵,是唯一的。_id的類型是mongoDB自己定義的objectID類型,因此儘管在查詢的時候可以得到一個12位或者24位的_id字串,但是如果想在selector裡面通過_id進行尋找或其他動作的時候,必須要先通過db.collection.id()方法進行類型轉換。 
person.remove({“_id”:person.id(stringID)}, callback(err){});  

8、mongoDB對文檔內的數組進行操作(通過update方法) [1]、通過$addToSet方法向數組中插入記錄,插入前該方法會先尋找是否存在這條記錄,如果存在則不插入;如果想要插入重複的值,則可以通過$push進行添加。 
person.update({“name”:”jobs”}, {$addToSet: {
company: {
name: “google”,
address: USA,
workingTime: 3
}
}, function(err){});

[2]、修改數組中的資料:通過$符。如果在數組中查詢的時候要匹配兩個屬性,必須要使用$elemMatch方法,如果只通過{"name":”google”, "address":USA}去尋找,會選擇到所有name為google或者address為USA的元素。在定位到這個元素之後,通過$來選定它進行修改。
person.update({
“name”:”jobs”,
company:{$elemMatch:{"name":”google”, "address":USA}}
}, {$set:{"company.$.workingTime":4}},function(){})

[3]、刪除數組中指定的資料:通過$pull方法
person.update({
“name”:”jobs”,
},{$pull:{company:{“name”:”google”, “address”:”USA”}}},function(err){})

$pop:刪除數組頭部或者尾部刪除一個值 {$pop:{filed:-1}} 從頭刪除,  {$pop:{filed:1}} 從尾部刪除。
personCollection.findAndModify({_id:'1111111'},[],{$pop:{tag:-1}},{new:true,upset:true},function(error,result){}

參考資料http://jysperm.me/technology/1575
http://www.cppblog.com/dead-horse/archive/2011/09/23/156617.html

https://github.com/kissjs/node-mongoskin




文檔資訊

  • 著作權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
  • 原文網址:http://blog.csdn.net/cdztop/article/details/31324027
  • 最後修改時間:2014年06月16日 06:32

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.