MongoDB基礎

數據庫創建與刪除

use DATABASE_NAME
若存在數據庫,則切換到數據庫下,若沒有,則創建之後在切換到數據庫下
db 查看當前所在數據庫
show dbs 查詢數據庫列表
show collections 查詢數據庫下的集合列表
新創建的空數據庫不會顯示在數據庫列表中,需要至少插入一個文檔進去
db.dropDatabase() 刪除當前的數據庫,如果沒有在任何數據庫裏面,則默認刪除 test 數據庫
db.createCollection( String Name,Cocument Options ) 用來創建集合,name是要創建的集合的名字,Options是可選的,指定有關內存大小,和索引選項。以下是可以使用的選項列表

字段 類型 描述
capped boolean (可選)如果爲true,則啓用封頂集合。封頂集合是固定大小的集合,會自動覆蓋最早的條目,當它達到其最大大小。如果指定true,則需要也指定尺寸參數。
autoIndexID Boolean (可選)如果爲true,自動創建索引_id字段的默認值是false。
size number (可選)指定最大大小字節封頂集合。如果封頂如果是 true,那麼你還需要指定這個字段。
max number (可選)指定封頂集合允許在文件的最大數量。

db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
在mongo中,不需要創建集合,當我們向集合中插入數據時,MongoDB會自動創建集合

db.COLLECTION_NAME.drop() 從數據庫中刪除一個集合,返回值爲true,表示刪除成功。

MongoDB支持的數據類型的列表如下:

類型 描述
String 最常用的數據類型,必須是有效的UTF-8
Integer 存儲一個數值,整數可以是32位或64位,取決於服務器
Boolean 存儲一個布爾值
Double 存儲浮點值
Min/Max keys 被用來對BSON元素的最低和最高值比較
Arrays 使用此類型的數組或列表或多個值存儲到一個鍵
Timestamp 時間戳。這可以方便記錄時的文件已被修改或添加
Object 此數據類型用於嵌入式的文件
Null 這種類型是用來存儲一個Null值
Symbol 此數據類型用於字符串相同,但它通常是保留給特定符號類型的語言使用
Date 此數據類型用於存儲當前日期或時間的UNIX時間格式。可以指定自己的日期和時間,日期和年,月,日到創建對象
Object ID 此數據類型用於存儲文檔的ID
Binary data 此數據類型用於存儲二進制數據
Code 此數據類型用於存儲到文檔中的JavaScript代碼
Regular expression 此數據類型用於存儲正則表達式

插入數據

db.COLLECTION_NAME.insert(document) 向集合中插入數據,其中document也可以是一個document數組

db.COLLECTION_NAME.find() 在非結構化的方式顯示所有文件
db.COLLECTION_NAME.find().pretty() 顯示在一個格式化的方式
db.COLLECTION_NAME.findOne() 返回一個文件

條件查詢

AND在mongo中的用法
如果在find()方法中,通過多個鍵分離,那麼Mongo將按照and的方式連接
db.COLLECTION_NAME.find({key1:value1,key2:value2})
示例:在movie集合中,查找所有name是test,discriptions是”this is a test” 的文件
db.movie.find({"name":"test","discriptions":"this is a test"})
上面的示例等價於 where name="test" and discriptions="this is a test"

OR在mongo中的用法
在 OR 條件的基礎上查詢文件,需要使用$or關鍵字,基礎語法如下:
db.COLLECTION_NAME.find({&or:[{key1:value1},{key2:value2}]})

OR 和 AND 一起使用
示例:在集合中查詢 number>10, aut=xuan或者titile=test的文件
db.COLLECTION_NAME.find("number":{&gt:10},&or:[{"auth"="xuan"},{"title"="test"}])

數據更新

update() 更新現有的文檔值
db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)
示例:
假設有以下集合

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Yiibai Overview"}

下面的例子將設置新標題’MongoDB Overview’的文件,更新其標題是“New MongoDB Tutorial”
>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
MongoDB默認將只更新單一的文件,來更新多個你需要設置參數置’multi’ 爲true
db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}},{multi:true})

db.COLLECTION_NAME.remove(DELLETION_CRITTERIA) 從集合中刪除文檔,remove() 方法接受兩個參數。第一個是刪除criteria ,第二是justOne標誌:
deletion criteria :(可選)刪除標準,根據文件將被刪除。
justOne : (可選)如果設置爲true或1,然後只刪除一個文件。
如果不指定刪除條件,然後MongoDB將從集合中刪除整個文件。這相當於SQL的truncate命令。

投影

mongodb 投影意思是隻選擇必要的數據而不是選擇一個文件的數據的整個。如果一個文檔有5個字段,需要顯示只有3個,然後選擇其中只有3個字段。

find() 方法
MongoDB 的find()方法,在 MongoDB查詢 文檔解釋接受第二個可選參數是要檢索的字段列表。在MongoDB中,當執行find()方法,那麼它會顯示一個文檔所有字段。要限制這一點,需要設置的字段列表值1或0。 1用來顯示字段而0是用來隱藏字段。

語法:
find()方法具有投影基本語法如下
db.COLLECTION_NAME.find({},{KEY:1})

limit()方法`
要限制 MongoDB 中的記錄,需要使用 limit() 方法。 limit() 方法接受一個數字型的參數,這是要顯示的文檔數。

語法:
limit() 方法的基本語法如下
db.COLLECTION_NAME.find().limit(NUMBER)

Skip() 方法(默認值爲0)
除了limit() 方法,還有一個方法skip() 也接受數字類型的參數,並使用跳過的文檔數。
語法
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
只顯示第二個文檔
db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)

排序

sort() 方法
要在 MongoDB 中的文檔進行排序,需要使用sort()方法。 sort() 方法接受一個文檔,其中包含的字段列表連同他們的排序順序。要指定排序順序1和-1。 1用於升序排列,而-1用於降序。

語法
sort() 方法的基本語法如下

db.COLLECTION_NAME.find().sort({KEY:1})
如果不指定排序優先,那麼sort() 方法將文檔顯示在升序排列。

索引

ensureIndex() 方法 索引
要創建一個索引,需要使用MongoDB 的ensureIndex()方法。

語法:
ensureIndex() 方法的基本語法如下
db.COLLECTION_NAME.ensureIndex({KEY:1})
這裏關鍵是要在其中創建索引,1是按升序排列的字段名稱。要創建降序索引,需要使用-1。
db.mycol.ensureIndex({"title":1})

在ensureIndex()方法,可以通過多個字段多個字段上創建索引。

db.mycol.ensureIndex({"title":1,"description":-1})

ensureIndex() 方法也可以接受的選項列表(可選),其下面給出的列表:

參數 類型 描述
background Boolean 在後臺建立索引,以便建立索引並不能阻止其他數據庫活動。指定true建立在後臺。默認值是 false.
unique Boolean 創建唯一索引,以便收集不會接受插入索引鍵或鍵匹配現有的值存儲在索引文檔。指定創建唯一索引。默認值是 false.
name string 索引的名稱。如果未指定,MongoDB中都生成一個索引名索引字段的名稱和排序順序串聯.
dropDups Boolean 創建一個唯一索引的字段,可能有重複。 MongoDB的索引只有第一次出現的一個鍵,從集合中刪除的所有文件包含該鍵的後續出現的。指定創建唯一索引。默認值是 false.
sparse Boolean 如果爲true,指數只引用文檔指定的字段。這些索引使用更少的空間,但在某些情況下,特別是各種不同的表現。默認值是 false.
expireAfterSeconds integer 指定一個值,以秒爲TTL控制多久MongoDB的文檔保留在此集合.
v index version 索引版本號。默認的索引版本取決於mongodb 運行的版本在創建索引時.
weights document 權重是從1到99999範圍內的數,表示該字段的意義,相對於其他的索引字段分數.
default_language string 對於文本索引時,決定停止詞和詞幹分析器和標記生成規則列表的語言。默認值是 english.
language_override string 對於文本索引時,指定的名稱在文檔中包含覆蓋默認的語言,語言字段中。默認值是語言。

聚合

聚合操作過程中的數據記錄和計算結果返回。聚合操作分組值從多個文檔,並可以執行各種操作,分組數據返回單個結果。在SQL COUNT(*)和group by 相當於MongoDB的聚集。

aggregate() 方法
對於在MongoDB中聚集,應該使用aggregate()方法。

語法:
aggregate() 方法的基本語法如下

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

例子:
在集合中,有以下的數據:

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'yiibai yiibai',
   url: 'http://www.yiibai.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'yiibai yiibai',
   url: 'http://www.yiibai.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

現在從上面的集合,如果想顯示一個列表,有很多用戶寫的教程,那麼使用 aggregate() 方法,如下所示:

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

{
   "result" : [
      {
         "_id" : "yiibai yiibai",
         "num_tutorial" : 2
      },
      {
         "_id" : "yiibai yiibai",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}

上述使用的情況相當於SQL查詢 select by_user, count(*) from mycol group by by_user

在上面的例子中,我們已分組字段 by_user 文檔,並在每個的次數by_user先前的值總和遞增。沒有聚集表達式列表。

b表達式 描述 示例
sum | 總結從集合中的所有文件所定義的值. | db.mycol.aggregate([{ group : {_id : "by_user", num_tutorial : { sum : "$likes”}}}])
avg| 從所有文檔集合中所有給定值計算的平均. |db.mycol.aggregate([{ group : {_id : "by_user", num_tutorial : { avg : "$likes”}}}])
min| 獲取集合中的所有文件中的相應值最小.|db.mycol.aggregate([{ group : {_id : "by_user", num_tutorial : { min : "$likes”}}}])
max| 獲取集合中的所有文件中的相應值的最大. |db.mycol.aggregate([{ group : {_id : "by_user", num_tutorial : { max : "$likes”}}}])
push|值插入到一個數組生成文檔中.|db.mycol.aggregate([{ group : {_id : "by_user", url : { push: "$url”}}}])
addToSet| 值插入到一個數組中所得到的文檔,但不會創建重複.| db.mycol.aggregate([{ group : {_id : "by_user", url : { addToSet : "$url”}}}])
first| sort”-stage. db.mycol.aggregate([{group : {_id : " by_user", first_url : {first:" url”}}}])
last| sort”-stage. db.mycol.aggregate([{group : {_id : " by_user", last_url : {last:" url”}}}])

管道

在UNIX 命令 shell 管道是指一些輸入和輸出作爲輸入下一個命令等執行操作的可能性。 MongoDB 聚合框架也支持同樣的概念。有一組可能的階段,每個這些的一組文檔作爲輸入,併產生一個結果集的文件(或最終生成的JSON文檔在管道末端)。然後又再次被用來爲下一階段等。

可能的階段聚合框架如下:

  • $project: 用於選擇從收集的一些具體字段。
  • $match: 這是一個濾波操作,因此可以減少量,作爲下一階段的輸入給定的文檔。
  • $group: 如上所討論的,這不實際的聚合。
  • $sort: 文件排序。
  • $skip: 與此有可能向前跳過的文件列表中的一個給定的的文檔數量。
  • $limit: 這限制了的文檔數量看一下由從當前位置開始的給定數
  • $unwind: 這是用來平倉文檔的中使用數組。使用數組時,數據是一種pre-joinded,再次有個別文件,此操作將被取消。因此,這個階段,數量會增加文件的下一階段。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章