數據庫創建與刪除
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":{>: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”}}}]) | ||
db.mycol.aggregate([{group : {_id : " by_user", first_url : { |
||
db.mycol.aggregate([{group : {_id : " by_user", last_url : { |
管道
在UNIX 命令 shell 管道是指一些輸入和輸出作爲輸入下一個命令等執行操作的可能性。 MongoDB 聚合框架也支持同樣的概念。有一組可能的階段,每個這些的一組文檔作爲輸入,併產生一個結果集的文件(或最終生成的JSON文檔在管道末端)。然後又再次被用來爲下一階段等。
可能的階段聚合框架如下:
- $project: 用於選擇從收集的一些具體字段。
- $match: 這是一個濾波操作,因此可以減少量,作爲下一階段的輸入給定的文檔。
- $group: 如上所討論的,這不實際的聚合。
- $sort: 文件排序。
- $skip: 與此有可能向前跳過的文件列表中的一個給定的的文檔數量。
- $limit: 這限制了的文檔數量看一下由從當前位置開始的給定數
- $unwind: 這是用來平倉文檔的中使用數組。使用數組時,數據是一種pre-joinded,再次有個別文件,此操作將被取消。因此,這個階段,數量會增加文件的下一階段。