簡介
? ? ?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}}}}
?