MongoDB系列二

靜逸發表於2015-07-12

簡介

     MongoDB是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。

   MongoDB是一個高效能,開源,無模式的文件型資料庫,是當前NoSql資料庫中比較熱門的一種。

     MongoDB是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。他支援的資料結構非常鬆散,是類似 json的bjson格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於物件導向的查詢語言,幾乎可以實現類似關聯式資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

    傳統的關聯式資料庫一般由資料庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由資料庫 (database)、集合(collection)、文件物件(document)三個層次組成。MongoDB對於關係型資料庫裡的表,但是集合中沒有列、行和關係概念,這體現了模式自由的特點。

特點

  它的特點是高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:

  1)面向集合儲存,易儲存物件型別的資料。

  2)模式自由。

  3)支援動態查詢。

  4)支援完全索引,包含內部物件。

  5)支援查詢。

  6)支援複製和故障恢復。

  7)使用高效的二進位制資料儲存,包括大型物件(如視訊等)。

  8)自動處理碎片,以支援雲端計算層次的擴充套件性。

  9)支援RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

  10)檔案儲存格式為BSON(一種JSON的擴充套件)。

  11)可通過網路訪問。

各檔案功能

Mongod.exe 是用來連線到mongo資料庫伺服器的,即伺服器端。

Mongo.exe 是用來啟動MongoDB shell的,即客戶端。

mongodump 邏輯備份工具。

mongorestore 邏輯恢復工具。

mongoexport  資料匯出工具。

mongoimport  資料匯入工具。

安裝MongoDB

mongod --dbpath D:\MongoDB\data --logpath=D:\MongoDB\logs\mongodb.log --logappend

MongoDB Windows環境安裝及配置  這篇文章介紹windows下安裝MongoDB不錯

C#中使用的MongoDB DLL驅動

 MongoDB.Driver.dll:顧名思義,驅動程式

 MongoDB.Bson.dll:序列化、Json相關

下載地址 http://files.cnblogs.com/files/liyunhua/MongoDBDll.zip

最最常用命令

use cnblogs // use 命令用來切換當前資料庫,如果該資料庫不存在,則會先新建一個。
show dbs // 顯示所有資料庫
show collections // 顯示當前資料庫下的所有集合
db.users.drop() // 刪除collection 如果刪除成功會返回“true”,否則返回“false”
db.dropDatabase()//刪除當前資料庫

 

簡單的說一下增加、修改、刪除

db.users.insert({'name':'angela','sex':'feman'})// 這條命令是向users 集合中插入一條資料。如果集合users不存在,則會先新建一個,然後再插入資料,引數以JSON格式傳入。
db.users.update({'name':'xiangshu'},{'$set':{'sex':'women'}},upsert=true,multi=false)//解釋一下幾個引數: 第一:查詢的條件、 第二:更新的欄位、 第三:如果不存在則插入 第四:是否允許修改多條記錄
db. users.remove({'name':'xumingxiang'})//刪除記錄  如果remove方法裡面不傳入任何引數則刪除所有資料  清除集合中的所有資料,但是不會刪除集合本身以及關聯的索引
db.users.find() //查詢

 細說上述update方法,上面update第三個引數是upsert,upsert操作就是說:如果我沒有查到,我就在資料庫裡面新增一條,其實這樣也有好處,就是避免了我在資料庫裡面判斷是update還是add操作,使用起來很簡單

預設情況下update方法是整體更新,如果需要區域性更新,mongodb中已經給我們提供了兩個修改器: $inc 和 $set。

$inc修改器也就是increase的縮寫,

每次修改會在原有的基礎上自增$inc指定的值,$inc修改符將匹配條件的文件的age鍵原子加一,預設情況下只是更新第一條符合條件的文件。可以通過update函式的最後一個引數來指定更新所有符合條件的文件

$set修改直接修改匹配文件的內容,如果修改的鍵存在則直接修改,否則新增。$unset修改符合$set的功能是完全相反的

具體複雜點的操作見Mongo學習筆記資料操作

詳述查詢命令

上面例子中的findOne方法是查詢出第一條語句。

一般的查詢條件有and、or 、in、not in、not

 db.person.find({"name":"jack","age":25})//相當於查詢name="jack" and age=25
db.person.find({ $or: [{ "name": "jack", "age": 25 }] })//相當於查詢name="jack" or age=25
db.person.find({ "name": { $in: ["jack", "joe"] } })//相當於查詢name in("jack","joe")

和sql server不一樣的是MongoDB的in list中的資料可以是不同型別。

db.person.find({ "name": { $nin: ["jack", "joe"] } })//相當於查詢name not in("jack","joe")
db.person.find({ "$or": [{ "name": { "$in": ["jack", "joe"] } }, { "age": 25 }] })//如何混合使用$or和$in。
db.person.find({ "name": { "$not": { "$in": ["jack", "joe"] } } })//$not表示取反,等同於SQL中的not。

下面是查詢的相關......

 db.person.find({}, {"name":1})//返回指定的文件鍵值對。只是返回name的鍵值對。
 db.person.find({}, {"name":0})//指定不返回的文件鍵值對。返回除name之外的所有鍵值對。

 那如果需要查詢一些特定條件的 事實上是可以用正則的,看下面的例子。

db.person.find({ "name": /^j/, "name": /e$/ });//查詢name startwith 'j' and endwith 'e'

有些查詢很複雜的話,$where派上用場了。

db.person.find({ $where: function () { return this.name == 'jack'; } })//查詢name='jack'

 下面說說比較運算子。

$lt/$lte/$gt/$gte/$ne,依次等價於</<=/>/>=/!=。(l表示less g表示greater e表示equal n表示not  )

 

db.person.find({ "age": { "$gte": 18, "#lte": 40 } });//返回符合條件age >= 18 && age <= 40

 

db.person.find({ "name": { "$ne": "jack" } })//返回條件符合name != "jack"

我相信大家在查詢資料的時候經常會碰到null,下面來說說null資料型別的查詢吧

db.person.find({"name":null})//在進行值為null資料的查詢時,所有值為null,以及不包含指定鍵的文件均會被檢索出來。
db.person.find({"name": {"$in": [null], "$exists":true}})
//需要將null作為陣列中的一個元素進行相等性判斷,即便這個陣列中只有一個元素。再有就是通過$exists判斷指定鍵是否存在。

mongodb跟sqlserver資料查詢還是有很大不相同的一部分的,最顯著不一樣的地方就是MongoDb中的陣列資料查詢。

具體來說說吧。現在假設我們資料庫裡面查詢出來的資料如下圖所示:

db.test.find({"fruit":"banana"})//陣列中所有包含banana的文件都會被檢索出來。
db.test.find({"fruit": {"$all": ["banana","apple"]}})//檢索陣列中需要包含多個元素的情況,這裡使用$all。陣列中必須同時包含apple和banana,但是他們的順序無關緊要。
db.test.find({"fruit":["apple","banana","peach"]})//精確匹配,即被檢索出來的文件,fruit值中的陣列資料必須和查詢條件完全匹配,即不能多,也不能少,順序也必須保持一致。
db.test.find({"fruit.2":"peach"})//匹配陣列中指定下標元素的值。陣列的起始下標是0。 檢視出fruit陣列中第二個元素的值為peach
db.test.find({"fruit": {$size : 3}})//可以通過$size獲取陣列的長度,但是$size不能和比較操作符聯合使用。就是說查詢出fruit長度為3的...

上述的例子是查詢fruit陣列長度為3的,那如果需要查詢長度大於3的應該怎麼辦呢

db.test.update({}, {"$set": {"size":3}},false,true)//只能是新增一個額外的鍵表示資料中的元素資料,在運算元據中的元素時,需要同時更新size鍵的值。
test.update({},{"$push": {"fruit":"strawberry"},"$inc":{"size":1}},false,true)//$inc每次新增一個新元素,都要原子性的自增size一次。
db.test.find({},{"fruit": {"$slice":2}, "size":0})//通過$slice返回陣列中的部分資料。"$slice":2表示陣列中的前兩個元素。"$slice":-2表示陣列中的後兩個元素。$slice : [2,1],表示從第二個2元素開始取1個,如果獲取數量大於2後面的元素數量,則取後面的全部資料。

大家都知道,MongoDB是由資料庫 (database)、集合(collection)、文件物件(document)三個層次組成。當一個文件物件中包含另外多個文件物件的時候,應該怎麼查詢呢?

這時候$elemMatch就有用武之地了。

假設我們資料庫裡面資料如下圖所示

db.person.find({"comments": {"$elemMatch": {"author":"joe","score":{"$gte":3}}}}

 

相關文章