# MongoDB ###### tags: `MongoDB` | SQL | MongoDB | 說明 | | -------- | -------- | -------- | | database | database | 資料庫 | | table | collection | 資料表 | | row | document | 資料行 | | column | field | 資料欄位 | | index | index | 索引 | | join | | MongoDB不支援join | | primary key | primary key | 主鍵,MongoDB自動將``_id``欄位設定為主鍵 | ## 建立資料庫 or 切換至已存在的資料庫 ``` use DATABASE_NAME ``` ## 刪除資料庫 ``` use twcode01 //移動到欲刪除的資料表 db.dropDatabase()//刪除 ``` ## 建立群集(資料表) ``` db.createCollection(name, options) ``` * name: 要建立的群集名稱 * options: **可選**引數, 指定有關記憶體大小及索引的選項 * capped * boolean * 如果為 true,則建立固定群集。固定群集是指有著固定大小的群集,當達到最大值時,它會自動覆蓋最早的檔案。 * autoIndexId * boolean * 如為 true,自動在 _id 欄位建立索引。預設為 false。 * size * int * 如果 capped 為 true,也需要指定該欄位 * max * int * 指定固定群集中包含檔案的最大數量 ## 刪除群集(資料表) ``` db.collection_name.drop() ``` ## 寫入檔案 ``` db.COLLECTION_NAME.insert(document) ``` ## 更新檔案 ### update() update() 方法用於更新已存在的檔案 ``` db.COLLECTION_NAME.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) ``` * query * update的搜尋條件,類似sql update搜尋內where後面的 * update * update的物件和一些更新的運算子(如$,$inc...)等,也可以理解為sql update搜尋內set後面的 * upsert * 如果不存在update的資料,是否寫入,true為寫入,預設是false,不寫入 * multi * 預設是false,只更新找到的第一筆資料,如果這個引數為true,就把按條件查出來多條資料全部更新。 * writeConcern * 拋出例外 ### save() save() 方法透過傳入的檔案來取代已有檔案 ``` db.COLLECTION_NAME.save( <document>, { writeConcern: <document> } ) ``` * document * 檔案資料 * writeConcern * 是否拋除例外 ### 範例 只更新第一筆資料: ``` db.COLLECTION_NAME.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } ); ``` 全部更新: ``` db.COLLECTION_NAME.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true ); ``` 只新增第一條: ``` db.COLLECTION_NAME.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false ); ``` 全部新增進去: ``` db.COLLECTION_NAME.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true ); ``` 全部更新: ``` db.COLLECTION_NAME.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true ); ``` 只更新第一筆資料: ``` db.COLLECTION_NAME.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false ); ``` ## 刪除檔案 ``` db.COLLECTION_NAME.remove( <query>, { justOne: <boolean>, writeConcern: <document> } ) ``` * query * 刪除的檔案的條件 * justOne * 如果設為 true 或 1,則只刪除一個檔案,如果不設定該引數,或使用預設值 false,則刪除所有匹配條件的檔案 * writeConcern * 拋出例外 ## 搜尋檔案 ``` db.COLLECTION_NAME.find(query, projection) ``` * query * 使用搜尋運算子指定搜尋條件 * projection * 使用投影運算子指定回傳的鍵。搜尋時回傳檔案中所有鍵值, 只需省略該引數即可 ### pretty() 方法以格式化的方式來顯示所有檔案。 ``` db.COLLECTION_NAME.find().pretty() ``` ### MongoDB 與 RDBMS Where 敘述比較 | 操作 | 格式 | 範例 | | ---------- | ----------------------- | ---- | | 等於 | ``{<key>:<value>}`` | ``db.COLLECTION_NAME.find({"by":"test"}).pretty()`` | | 小於 | ``{<key>:{$lt:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$lt:50}}).pretty()`` | | 小於或等於 | ``{<key>:{$lte:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$lte:50}}).pretty()`` | | 大於 | ``{<key>:{$gt:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$gt:50}}).pretty()`` | | 大於或等於 | ``{<key>:{$gte:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$gte:50}}).pretty()`` | | 不等於 | ``{<key>:{$ne:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$ne:50}}).pretty()`` | >MongoDB 搜尋檔案 OR 條件、AND 條件 >https://www.twcode01.com/mongodb/mongodb-query.html ## 條件運算子 * ``>`` 大於 ``$gt`` * ``<`` 小於 ``$lt`` * ``>=`` 大於等於 ``$gte`` * ``<= `` 小於等於 ``$lte`` ## 運算 ``` db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) ``` ### 運算式 * $sum 總和 * ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])`` * $avg 平均值 * ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])`` * $min 取得最小值 * ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])`` * $max 取得最大值 * ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])`` * $push 寫入值到一個陣列中 * ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])`` * $addToSet 寫入值到一個陣列中,但不建立副本 * ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])`` * $first 根據資源檔案的排序取得第一個檔案資料 * `` db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])`` * $last 根據資源檔案的排序取得最後一個檔案資料 * `` db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])`` ### 操作 * $project:修改輸入檔案的結構。可以用來重命名、增加或刪除域,也可以用於建立計算結果以及巢狀檔案。 * $match:用於過濾資料,只輸出符合條件的檔案。$match使用MongoDB的標準搜尋操作。 * $limit:用來限制MongoDB聚合管道回傳的檔案數。 * $skip:在聚合管道中跳過指定數量的檔案,並回傳餘下的檔案。 * $unwind:將檔案中的某一個陣列型別欄位拆解成多條,每條包含陣列中的一個值。 * $group:將群集中的檔案分組,可用於統計結果。 * $sort:將輸入檔案排序後輸出。 * $geoNear:輸出接近某一地理位置的有序檔案。 >https://www.twcode01.com/mongodb/mongodb-aggregate.html