天天看點

MongoDB 連接配接和資料庫/集合/文檔操作

MongoDB 不同的連接配接方式

首先啟動服務(bin 目錄下執行 mongodb)

标準URL連接配接文法

mongodb:固定格式,必須指定

username:password@:可選項,設定後在連接配接後會嘗試登陸資料庫

host1:必須置頂至少一個 host ;如果要連接配接複制集,需要指定多個位址

portX :可選的指定端口,預設是27017

/database :如果指定賬号密碼,連接配接驗證登陸指定資料庫;否則打開 test 資料庫

?options :連接配接選項,所有連接配接選項都是鍵值對 name=value,鍵值對之間通過“ & ”或 “ ;”隔開

連接配接選項 options:

選項

描述

replicaSet=name

驗證replica set的名稱。 Impliesconnect=replicaSet.

slaveOk=true|false

true:在connect=direct模式下,驅動會連接配接第一台機器,即使這台伺服器不是主。在connect=replicaSet模式下,驅動會發送所有的寫請求到主并且把讀取操作分布在其他從伺服器。false: 在 connect=direct模式下,驅動會自動找尋主伺服器. 在connect=replicaSet 模式下,驅動僅僅連接配接主伺服器,并且所有的讀寫指令都連接配接到主伺服器。

safe=true|false

true: 在執行更新操作之後,驅動都會發送getLastError指令來確定更新成功。(還要參考 wtimeoutMS).false: 在每次更新之後,驅動不會發送getLastError來確定更新成功。

w=n

驅動添加 { w : n } 到getLastError指令. 應用于safe=true。

wtimeoutMS=ms

驅動添加 { wtimeout : ms } 到 getlasterror 指令. 應用于 safe=true.

fsync=true|false

true: 驅動添加 { fsync : true } 到 getlasterror 指令.應用于 safe=true.false: 驅動不會添加到getLastError指令中。

journal=true|false

如果設定為 true, 同步到 journal (在送出到資料庫前寫入到實體中). 應用于 safe=true

connectTimeoutMS=ms

可以打開連接配接的時間。

socketTimeoutMS=ms

發送和接受sockets的時間。

使用預設端口連接配接服務

通過 shell 連接配接服務

資料庫操作

在 MongoDB 中,集合隻有在内容插入後才會建立 就是說,建立集合(資料表)後要再插入一個文檔(記錄),集合才會真正建立。

集合操作

如果在不存在的集合中直接插入文檔,則集合會自動被建立

name:要建立的集合名稱

options:可選參數,制定有關記憶體大小及索引的選項

字段

類型

capped

布爾

(可選)如果為 true,則建立固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆寫最早的文檔。 當該值為 true 時,必須指定 size 參數。

autoIndexId

3.2 之後不再支援該參數。(可選)如為 true,自動在 _id 字段建立索引。預設為 false。

size

數值

(可選)為固定集合指定一個最大值,即位元組數。 如果 capped 為 true,也需要指定該字段。

max

(可選)指定固定集合中包含文檔的最大數量。

文檔操作

使用 insert() 或 save() 方法向集合中插入文檔,文法如下:

save():如果 _id 主鍵存在則更新資料,如果不存在就插入資料。該方法新版本中已廢棄,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 來代替。

insert(): 若插入的資料主鍵已經存在,則會抛 org.springframework.dao.DuplicateKeyException 異常,提示主鍵重複,不儲存目前資料。

document:要寫入的文檔。

writeConcern:寫入政策,預設為 1,即要求确認寫操作,0 是不要求。

ordered:指定是否按順序寫入,預設 true,按順序寫入。

query : update的查詢條件,類似sql update查詢内where後面的。

update : update的對象和一些更新的操作符(如$,$inc...)等,也可以了解為sql update查詢内set後面的

upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。

multi : 可選,mongodb 預設是false,隻更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。

writeConcern :可選,抛出異常的級别。

query :(可選)删除的文檔的條件。

justOne : (可選)如果設為 true 或 1,則隻删除一個文檔,如果不設定該參數,或使用預設值 false,則删除所有比對條件的文檔。

writeConcern :(可選)抛出異常的級别。

查詢文檔

MongoDB 使用 find() 方法以非結構化的方式來顯示文檔

query :可選,使用查詢操作符指定查詢條件

projection :可選,使用投影操作符指定傳回的鍵。查詢時傳回文檔中所有鍵值, 隻需省略該參數即可(預設省略)。

操作

格式

範例

RDBMS中的類似語句

等于

<code>{&lt;key&gt;:&lt;value&gt;</code>}

<code>db.col.find({"by":"菜鳥教程"}).pretty()</code>

<code>where by = '菜鳥教程'</code>

小于

<code>{&lt;key&gt;:{$lt:&lt;value&gt;}}</code>

<code>db.col.find({"likes":{$lt:50}}).pretty()</code>

<code>where likes &lt; 50</code>

小于或等于

<code>{&lt;key&gt;:{$lte:&lt;value&gt;}}</code>

<code>db.col.find({"likes":{$lte:50}}).pretty()</code>

<code>where likes &lt;= 50</code>

大于

<code>{&lt;key&gt;:{$gt:&lt;value&gt;}}</code>

<code>db.col.find({"likes":{$gt:50}}).pretty()</code>

<code>where likes &gt; 50</code>

大于或等于

<code>{&lt;key&gt;:{$gte:&lt;value&gt;}}</code>

<code>db.col.find({"likes":{$gte:50}}).pretty()</code>

<code>where likes &gt;= 50</code>

不等于

<code>{&lt;key&gt;:{$ne:&lt;value&gt;}}</code>

<code>db.col.find({"likes":{$ne:50}}).pretty()</code>

<code>where likes != 50</code>

(&gt;) 大于 - $gt

(&lt;) 小于 - $lt

(&gt;=) 大于等于 - $gte

(&lt;= ) 小于等于 - $lte

$type,指定查詢的資料類型

索引可以極大的提高查詢效率

索引是一種特殊的資料結構,存儲在一個易于周遊讀取的資料集合中,是對資料庫表中一列或多列的值進行排序的一種結構

Parameter

Type

Description

background

Boolean

建索引過程會阻塞其它資料庫操作,background可指定以背景方式建立索引,即增加 "background" 可選參數。 "background" 預設值為false。

unique

建立的索引是否唯一。指定為true建立唯一索引。預設值為false.

name

string

索引的名稱。如果未指定,MongoDB的通過連接配接索引的字段名和排序順序生成一個索引名稱。

dropDups

3.0+版本已廢棄。在建立唯一索引時是否删除重複記錄,指定 true 建立唯一索引。預設值為 false.

sparse

對文檔中不存在的字段資料不啟用索引;這個參數需要特别注意,如果設定為true的話,在索引字段中不會查詢出不包含對應字段的文檔.。預設值為 false.

expireAfterSeconds

integer

指定一個以秒為機關的數值,完成 TTL設定,設定集合的生存時間。

v

index version

索引的版本号。預設的索引版本取決于mongod建立索引時運作的版本。

weights

document

索引權重值,數值在 1 到 99,999 之間,表示該索引相對于其他索引字段的得分權重。

default_language

對于文本索引,該參數決定了停用詞及詞幹和詞器的規則的清單。 預設為英語

language_override

對于文本索引,該參數指定了包含在文檔中的字段名,語言覆寫預設的language,預設值為 language.

用于處理資料,如統計平均值,求和等操作,類似 SQL 語句中的 count(*)

聚合表達式

表達式

執行個體

$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

根據資源文檔的排序擷取第一個文檔資料。

db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])

$last

根據資源文檔的排序擷取最後一個文檔資料

db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道在 Unix 和 Linux 中用于将目前指令的輸出結果作為下一個指令的參數

MongoDB 的聚合管道将文檔在一個管道處理完畢後,将結果傳遞給下一個管道處理,管道操作是可以重複的

表達式:處理輸入文檔并輸出。是無狀态的,隻能用于計算按目前聚合管道的文檔,不能處理其他的文檔

聚合架構的常用操作:

$project:修改輸入文檔的結構。可以用來重命名、增加或删除域,也可以用于建立計算結果以及嵌套文檔。

$match:用于過濾資料,隻輸出符合條件的文檔。$match使用MongoDB的标準查詢操作。

$limit:用來限制MongoDB聚合管道傳回的文檔數。

$skip:在聚合管道中跳過指定數量的文檔,并傳回餘下的文檔。

$unwind:将文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。

$group:将集合中的文檔分組,可用于統計結果。

$sort:将輸入文檔排序後輸出。

$geoNear:輸出接近某一地理位置的有序文檔。