1. 程式人生 > >《MongoDB實戰》—— Javascript Shell操作MongoDB(二)

《MongoDB實戰》—— Javascript Shell操作MongoDB(二)

show dbs;   顯示所有資料庫。

use test;   若原來存在test資料庫,則切換到test,若不存在,就建立test資料庫。

show collections;  顯示當前資料庫的所有文件。

建立文件時若沒有指定_id欄位,就預設建立一個_id即ObjectId,_id是唯一的,可以插入自己的_id。

db.users.count();  顯示users文件數量。

查詢中指定多個欄位,會隱式建立AND語句。也可以顯示指定 $and 操作符。注:MongoDB一切基於文件操作,需要{}括起來鍵值對。

類似的,有 $or 操作符。

更新文件

更新操作符:$set  和 db.users.update()方法。(注:往後將省略db.users,表述為update方法)

第一個引數為文件資訊,第二個引數為將修改的欄位資訊。

替換文件

只用update方法但不使用操作符$set則會替換原文件。

注:若確定是新增或修改某個文件的欄位,則務必加上$set,否則會替換整個文件!

pretty()方法美化輸出。嚴格來說,find()命令文件返回一個cursor游標,pretty()實際上就是 cursor.pretty()。

點操作符搜尋鍵的內部鍵來查詢。(注:單個鍵可以不用引號,但鍵中鍵必須加引號,否則報錯,因此建議都加上引號)

可以看到,若用陣列形式表示,則必須精確匹配文件;若不用陣列形式,則表示查詢陣列中包含某個值的文件。

高階更新

若想在陣列(列表)中新增一個值,不要用$set操作符,因為這要重新編寫併發送整個陣列。向列表新增元素,最好使用

$push 或者 $addToSet。後者是唯一的,防止資料重複。

可以看到,$addToSet 操作符新增列表中有的資料時,返回結果"nModified"值為0

刪除資料

注:一定要在remove方法中傳遞引數,否則無引數的remove方法將刪除集合中的所有文件!但不會刪除集合,類似SQL中的delete命令。若向要刪除集合及附帶的索引資料,用drop方法,db.users.drop()

shell其他特性

help

db.help()

終端命令列  mongo --help

使用索引建立和查詢

建立大集合,索引只有在集合包含許多文件的時候才有意義。下面建立20000個文件:

it 命令告訴 shell 返回下一個結果集。最開始 it 命令返回no cursor,當使用find()方法後再 it 就返回下面的結果集(預設一次返回20個),說明 find() 方法會建立一個遊標且自動迭代遊標。

$gt  $lt  $gte  $ lte  $ne  分別指大於、小於、大於等於、小於等於、不等於。

explain()方法,除錯和優化查詢。它描述了查詢路徑並通過確定查詢使用的索引來診斷慢查詢語句。

db.numbers.find({num: {"$gt": 500, "$lt": 505}}).explain()    不加引數

db.numbers.find({num: {"$gt": 500, "$lt": 505}}).explain("executionStats")  請求不同的模式並輸出詳細資訊。

返回結果中:"totalDocsExamined" : 20000,表示查詢引擎掃描了整個集合(即20000個文件),而"nReturned" : 4,表示只返回了4個結果!可以看到,掃描文件數量和低效查詢數量差距很大(20000 VS 4)!"totalKeysExamined" : 0,表示整個掃描的索引數量為0。"executionTimeMillis" : 17,表示查詢消耗17毫秒。

給集合建立索引,createIndex()方法

{num: 1} 表示為集合中的所有文件的num鍵建立 升序 索引。

getIndexes()方法來檢驗索引是否建立成功

  • key是指index key的定義,包括兩部分:key 和值(排序的方向,1為升序);
  • name是index name;
  • ns是namespace;
  • v 標識index 版本,如果索引中包含"v":1,說明index是以新格式儲存的,效能較高。

_id索引時集合自動建立,有兩個索引,名字分別較_id_和num_1,這是沒有設定索引名而MongoDB自動建立的名字。

再次執行 db.numbers.find({num: {"$gt": 500, "$lt": 505}}).explain("executionStats"),結果為:"nReturned":4, "executionTimeMillis" : 3, "totalKeysExamined" : 4, "totalDocsExamined" : 4,更快!

基本管理

show dbs;  show collections;

db.stats();

也可以在單個集合上執行 stats() 方法, db.users.stats()

命令如何執行

MongoDB的所有資料庫命令都有共同點,即它們在一個叫 $cmd 的虛擬集合上實現查詢。

stats() 方法包裝了 shell 命令的方法呼叫,即 db.stats() 也是使用 {dbstats: 1} 定義的。

db.runCommand({collstats: "users"})  輸出結果也同db.users.stats()。

db.runCommand  無括號呼叫將返回內部機制(其函式定義),理解底層的機制。

help() 方法返回一個方法列表,如 db.users.help() 

兩次 tab 鍵能輸出所有匹配的方法。

db.users.find  無括號的呼叫方法將返回此方法的實現程式碼。