標籤:
特點
無模式MongoDB 中的每一條文檔,都是一個 JSON 對象,因此你無需提前定義一個集合的結構,集合中的每一個文檔也能夠有不同的結構。
非同步寫入MongoDB 預設全部的寫操作都是『不安全』的,即當請求被 MongoDB 收到時,不等寫入操作完畢,就返回一個『成功』的響應。 這是預設的行為,當然你也能夠設定一些選項,讓操作等待等待寫入完畢後再返迴響應。只是對於大多數應用,這樣的『不安全』已經足夠安全了。
簡單查詢MongoDB 僅僅支援簡單的查詢,MongoDB 僅僅儲存資料,很多其它的邏輯應該在應用中解決。因此 MongoDB 有著簡單的且在各程式設計語言下高度一致的 API 介面。
無需營運MongoDB 差點兒沒有什麼選項能夠設定,叢集也是設定一次之後就能夠自己主動地解決故障,極少須要維護。
安裝和備份執行 mongod 啟動資料庫,執行 mongo 啟動client Shell,。
MongoDB 被設計執行於 64bit 的作業系統,在 32bit 的情況下,資料檔案最大限制為 2G.
MongoDB 在執行時並不會即時地將改動寫入磁碟,因此在關閉server時須要給 MongoDB 時間將全部資料寫入磁碟。當出現server突然掉電的情況時,MongoDB 的資料庫檔案會損壞,須要進行修複才幹又一次執行,這個過程中會丟失掉電時進行中的寫入操作。在對執行中的 MongoDB 進行備份時,須要使用內建的 mongodump 工具,不能直接複製其資料庫檔案。
設計文檔結構
ObjectIDMongoDB 會為每個文檔預設加入一個名為 _id, 類型為 ObjectId的欄位,這個欄位用來唯一地標識每個文檔。這個 ID 通過時間,server,進程號被產生,甚至能夠覺得是全世界唯一的。
除了 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:[email protected]: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部分加上{upset: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){}
更新
2014年07月19日15:11:23
近期在項目中實際遇到的兩個注意點:
1、一次不能對同一個屬性欄位進行兩次操作;
2、$inc或$set等操作時,不能時empty。
參考資料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
MongoDB + node-mongoskin簡單示範範例