主頁 > 資料庫 > MongoDB學習筆記:JavaScript shell

MongoDB學習筆記:JavaScript shell

2022-01-30 07:50:15 資料庫

本文更新于2022-01-22,使用MongoDB 4.4.5,

目錄
  • 輔助擴展
    • edit
    • help
    • it
    • show collections
    • show databases
    • show dbs
    • show tables
    • show users
    • use
  • BulkWriteResult
  • db
  • DB
    • DATABASE.COLLECTION_NAME
    • DB.prototype.adminCommand
      • flushRouterConfig
      • getParameter
      • logRotate
      • movePrimary
      • removeShard
      • replSetMaintenance
      • setParameter
    • DB.prototype.auth
    • DB.prototype.createCollection
    • DB.prototype.createUser
    • DB.prototype.currentOp
    • DB.prototype.fsyncLock
    • DB.prototype.fsyncUnlock
    • DB.prototype.getCollection
    • DB.prototype.getCollectionNames
    • DB.prototype.getLastError
    • DB.prototype.getMongo
    • DB.prototype.getProfilingLevel
    • DB.prototype.getSisterDB
    • DB.prototype.help
    • DB.prototype.isMaster
    • DB.prototype.killOp
    • DB.prototype.listCommands
    • DB.prototype.printReplicationInfo
    • DB.prototype.printSlaveReplicationInfo
    • DB.prototype.runCommand
      • compact
      • connPoolStats
      • dataSize
      • dbHash
    • DB.prototype.serverCmdLineOpts
    • DB.prototype.serverStatus
    • DB.prototype.setProfilingLevel
    • DB.prototype.shutdownServer
    • DB.prototype.stats
    • DB.prototype.version
  • DBCollection
    • DBCollection.prototype.aggregate
    • DBCollection.prototype.convertToCapped
    • DBCollection.prototype.count
    • DBCollection.prototype.createIndex
    • DBCollection.prototype.deleteMany
    • DBCollection.prototype.deleteOne
    • DBCollection.prototype.distinct
    • DBCollection.prototype.drop
    • DBCollection.prototype.dropIndex
    • DBCollection.prototype.find
    • DBCollection.prototype.findAndModify
    • DBCollection.prototype.findOne
    • DBCollection.prototype.getIndexes
    • DBCollection.prototype.help
    • DBCollection.prototype.insert
    • DBCollection.prototype.insertMany
    • DBCollection.prototype.insertOne
    • DBCollection.prototype.mapreduce
    • DBCollection.prototype.remove
    • DBCollection.prototype.renameCollection
    • DBCollection.prototype.save
    • DBCollection.prototype.stats
    • DBCollection.prototype.update
    • DBCollection.prototype.updateMany
    • DBCollection.prototype.updateOne
    • DBCollection.prototype.validate
  • DBQuery
    • DBQuery.prototype.explain
    • DBQuery.prototype.forEach
    • DBQuery.prototype.hasNext
    • DBQuery.prototype.hint
    • DBQuery.prototype.limit
    • DBQuery.prototype.min
    • DBQuery.prototype.max
    • DBQuery.prototype.next
    • DBQuery.prototype.pretty
    • DBQuery.prototype.skip
    • DBQuery.prototype.sort
    • DBQuery.prototype.toArray
  • EDITOR
  • ISODate
  • load
  • MaxKey
  • MinKey
  • Mongo
    • new Mongo
    • Mongo.prototype.getDB
    • Mongo.prototype.getDBs
    • Mongo.prototype.setSlaveOk
  • NumberInt
  • NumberLong
  • Object
    • Object.bsonsize
  • ObjectId
    • OBJECTID.str
    • ObjectId.prototype.getTimestamp
  • print
  • printjson
  • prompt
  • run
  • ReplSetTest
    • new ReplSetTest
    • REPLSETTEST.initiate
    • REPLSETTEST.startSet
    • REPLSETTEST.stopSet
  • rs
    • rs.add
    • rs.addArb
    • rs.config
    • rs.freeze
    • rs.help
    • rs.initiate
    • rs.reconfig
    • rs.remove
    • rs.status
    • rs.stepDown
    • rs.syncFrom
  • sh
    • sh.addShard
    • sh.addShardTag
    • sh.addTagRange
    • sh.enableSharding
    • sh.getBalancerState
    • sh.help
    • sh.moveChunk
    • sh.splitAt
    • sh.removeShardTag
    • sh.setBalancerState
    • sh.shardCollection
    • sh.status
  • ShardingTest
    • new ShardingTest
    • SHARDINGTEST.stop
  • startParallelShell
  • Timestamp
    • new Timestamp
  • WriteResult

可于官網搜索相關檔案:https://www.mongodb.com/search

說明:下文中,大寫為自定義變數(個別大寫的型別除外),根據實際情況填寫,使用<>引起表示內容可選,|表示使用左側或右側內容,...表示重復之前內容,

支持所有JavaScript內置的型別,

輔助擴展

輔助擴展不可在腳本檔案中使用,

edit

編輯變數,使用EDITOR變數或環境變數指定的編輯器編輯,

edit VAR_NAME

help

查看幫助,

help

it

對查詢結果進行下一次遍歷,對DBCollection.prototype.find使用,

it

show collections

查看當前資料庫的所有集合,

show collections

show databases

查看所有資料庫,建議使用show dbs

show databases

show dbs

查看所有資料庫,

show dbs

show tables

查看當前資料庫的所有集合,建議使用show collections

show tables

show users

查看當前資料庫的所有用戶,

show users

use

切換資料庫,

use DB_NAME

BulkWriteResult

多個寫入結果型別,包括以下欄位:

  • nMatched:匹配查詢條件的檔案數量,
  • nModified:修改的檔案數量,
  • nUpserted:執行upsert的檔案數量,
  • nInserted:插入的檔案數量,
  • nRemoved:洗掉的檔案數量,
  • upserted
  • writeErrors
  • writeConcernErrors

db

當前資料庫,為DB型別,

DB

資料庫型別,

DATABASE.COLLECTION_NAME

資料庫指定的集合,等同于DATABASE[COLLECTION_NAME],為DBCollection型別,

DB.prototype.adminCommand

以管理員身份執行命令,可執行管理員命令,會在admin資料庫上執行,會在$cmd集合上執行,大多數命令都有方法對其進行封裝,

var OBJ = DATABASE.adminCommand(COMMAND_DOC);

COMMAND_DOC第一個欄位為命令名,

回傳包括以下欄位:

  • errmsg:當ok為0時,描述失敗的原因,
  • ok:1為成功,0為失敗,

flushRouterConfig

重繪分片集群的路由配置元資訊,

var OBJ = DATABASE.adminCommand({flushRouterConfig: 1});

getParameter

獲取引數,

var OBJ = DATABASE.adminCommand({getParameter: 1, PARAM: 1});

PARAM見setParameter命令,

logRotate

日志檔案輪替,

var OBJ = DATABASE.adminCommand({logRotate: 1});

movePrimary

將主分片上的資料庫遷移至其他分片,

var OBJ = DATABASE.adminCommand({movePrimary: DB_NAME, to: SHARD_NAME});

removeShard

從分片集群中洗掉分片,

var OBJ = DATABASE.adminCommand({removeShard: SHARD_NAME});

回傳包括以下欄位:

  • dbsToMove:當遷移主分片時需要遷移的資料庫名陣列,
  • msg:執行資訊,
  • note:下一步操作的提示,
  • state:執行狀態,完成為completed,

洗掉分片可能需要很長時間,可執行多次來查看執行狀態,

replSetMaintenance

強制副本集備份節點進入/退出維護模式,不能在主節點上執行,

var OBJ = DATABASE.adminCommand({replSetMaintenance: BOOL});

setParameter

設定引數,

var OBJ = DATABASE.adminCommand({setParameter: 1, PARAM: VALUE});

PARAM可為:

  • logLevel:日志等級,

DB.prototype.auth

身份驗證,

var RESULT = db.auth(USERNAME, PASSWORD);

驗證通過回傳1,不通過回傳0,

DB.prototype.createCollection

創建集合,

var OBJ = DATABASE.createCollection(COLLECTION_NAME <, COLLECTION_OPTION_DOC>);

COLLECTION_OPTION_DOC可使用以下欄位:

  • autoIndexId:是否在_id上創建索引,預設為true,
  • capped:是否創建為固定集合,預設為false,如為true則必需同時指定size
  • max:固定集合的最大檔案數量,
  • size:固定集合的位元組大小,

DB.prototype.createUser

在當前資料庫添加用戶,

db.createUser({
	user: USER,
	pwd: PASSWORD,
	roles: [ROLE|{role: ROLE, db: DBNAME} <, ...>]
});

引數可使用以下欄位:

  • pwd:密碼,
  • roles:身份角色陣列,可使用兩種形式,其中一種形式可使用以下欄位:
    • db:將身份角色限制在此資料庫上,
    • role:身份角色,
  • user:用戶名,

ROLE可為:

  • 資料庫用戶角色:
    • read:讀資料庫的檔案,
    • readWrite:讀寫資料庫的檔案,
  • 資料庫管理角色:
    • dbAdmin:資料庫管理者,如創建索引、查看統計,不包括資料庫用戶管理,
    • dbOwner:資料庫所有者,擁有資料庫的所有權限,
    • userAdmin:資料庫用戶管理,
  • 集群管理角色,用于副本集和分片集群:
    • clusterAdmin:集群管理者,擁有集群的所有管理權限,只在admin資料庫可用,
    • clusterManager:集群管理員,擁有集群的管理和監控權限,只在admin資料庫可用,
    • clusterMonitor:集群監控員,擁有集群的監控權限,只在admin資料庫可用,
    • hostManager:主機管理員,管理主機節點,只在admin資料庫可用,
  • 備份恢復角色:
    • backup:資料庫備份,
    • restore:資料庫恢復,
  • 于所有資料庫上的角色:
    • dbAdminAnyDatabase:所有資料庫管理者,如創建索引、查看統計,不包括資料庫用戶管理,只在admin資料庫可用,
    • readAnyDatabase:讀所有資料庫的檔案,只在admin資料庫可用,
    • readWriteAnyDatabase:讀寫所有資料庫的檔案,只在admin資料庫可用,
    • userAdminAnyDatabase:所有資料庫用戶管理,只在admin資料庫可用,
  • 超級用戶角色:
    • root:超級權限,
  • 內部角色:
    • __system:表示副本集或分片集群節點的內部角色,

無回傳,會列印結果資訊,

DB.prototype.currentOp

獲取當前的所有操作,

var OBJ = DATABASE.currentOp(<QUERY_DOC>);

QUERY_DOC見DBCollection.prototype.find,為回傳的inprog陣列元素指定匹配條件,

回傳包括以下欄位:

  • inprog:正在執行的操作的陣列,
    • active:操作是否正在運行,如為false,則此操作已交出或正等待其他操作交出鎖,
    • client:操作的客戶端地址,
    • desc:操作的客戶端描述,可能為“connN”的形式,N為連接ID,
    • locks:操作使用的鎖,全域鎖為^
    • lockStatus:操作使用的鎖的狀態,
      • timeAcquiringMicros:操作獲得鎖必需等待的時間,單位為毫秒,
    • ns:操作執行的命名空間,
    • numYields:操作交出鎖使其他操作得以運行的次數,
    • op:操作的型別,可為:command、getmore、insert、killcursors、none、query、remove、update,
    • opid:操作的ID,
    • secs_running:操作執行的時間,單位為秒,
    • waitingForLock:操作是否正在等待鎖,

DB.prototype.fsyncLock

鎖定所有資料庫,禁止寫入操作,都會被加入佇列中等待,并進行同步,將所有臟頁重繪至磁盤,

var OBJ = DATABASE.fsyncLock();

DB.prototype.fsyncUnlock

解鎖所有資料庫,

var OBJ = DATABASE.fsyncUnlock();

DB.prototype.getCollection

獲取集合,類似DATABASE.COLLECTION_NAME

var DBCOLLECTION = DATABASE.getCollection(COLLECTION_NAME);

回傳DBCollection型別,

DB.prototype.getCollectionNames

獲取所有集合名,類似show collections

var NAME_ARR = DATABASE.getCollectionNames();

DB.prototype.getLastError

獲取最后一次操作的錯誤等資訊,

var OBJ = DATABASE.getLastError();

DB.prototype.getMongo

獲取連接,

var MONGO = DATABASE.getMongo();

回傳Mongo型別,

DB.prototype.getProfilingLevel

獲取資料庫的系統分析器等級,

var LEVEL = DATABASE.getProfilingLevel();

DB.prototype.getSisterDB

獲取同級資料庫,類似use DB_NAME

var DATABASE2 = DATABASE.getSisterDB(DB_NAME);

回傳DB型別,

DB.prototype.help

查看資料庫的幫助,

DATABASE.help();

DB.prototype.isMaster

是否是副本集的主節點,

var OBJ = DATABASE.isMaster();

回傳的欄位包括:

  • hosts:所有節點的地址,不可見隱藏節點,
  • ismaster:是否是主節點,單機模式下為true,
  • me:當前節點的地址,
  • primary:主節點的地址,
  • secondary:是否是備份節點,
  • setName:副本集名稱,

DB.prototype.killOp

終止操作,只有交出了鎖的操作(如更新、查找、洗掉)才能被終止,正在占用鎖或正在等待鎖的操作無法被終止,

var OBJ = DATABASE.killOp(OPID);

當操作從DB.prototype.currentOp的回傳陣列中消失后才真正被終止,

DB.prototype.listCommands

列出所有命令,

DATABASE.listCommands();

DB.prototype.printReplicationInfo

查看副本集的oplog資訊,可在主節點和備份節點上執行,

DATABASE.printReplicationInfo();

無回傳,會列印幾行資訊:

  • configured oplog size:配置的oplog大小,
  • log length start to end:oplog中記錄的事件的開始時間到結束時間的時長,
  • oplog first event time:oplog中記錄的事件的開始時間,
  • oplog last event time:oplog中記錄的事件的結束時間,
  • now:當前時間,

DB.prototype.printSlaveReplicationInfo

查看副本集備份節點的oplog資訊,可在主節點和備份節點上執行,

DATABASE.printSlaveReplicationInfo();

無回傳,會列印幾個小節的備份節點資訊,每個小節包括幾行資訊:

  • source:備份節點的主機和埠,
    • syncedTo:備份節點資料同步至的時間,
    • 落后于主節點的時長,

DB.prototype.runCommand

執行命令,不可執行管理員命令,會在$cmd集合上執行,大多數命令都有方法對其進行封裝,

var OBJ = DATABASE.runCommand(COMMAND_DOC);

COMMAND_DOC第一個欄位為命令名,

回傳包括以下欄位:

  • errmsg:當ok為0時,描述失敗的原因,
  • ok:1為成功,0為失敗,

compact

壓縮集合,

var OBJ = DATABASE.runCommand({compact: COLLECTION_NAME});

回傳包括以下欄位:

  • bytesFreed:釋放的位元組數,

會消耗大量資源,

connPoolStats

查看分片集群的連接池狀態,

var OBJ = DATABASE.runCommand({connPoolStats: 1});

只在分片集群的mongos和mongod上運行才有意義,

dataSize

查看資料總大小,

var OBJ = DATABASE.runCommand({
	dataSize: COLLECTION_NAMESPACE
	<, keyPattern: {KEY: 1|-1 <, ...>}
	 <, min: {KEY: VALUE <, ...>}>
	 <, max: {KEY: VALUE <, ...>}>
	>
});

COLLECTION_NAMESPACE即"DB_NAME.COLLECTION_NAME",

回傳包括以下欄位:

  • numObjects:檔案數,
  • millis:執行的毫秒數,
  • size:總大小,單位為位元組,

需要掃描所有檔案,

dbHash

獲取資料庫的散列值,

var OBJ = DATABASE.runCommand({dbHash: 1});

DB.prototype.serverCmdLineOpts

查看啟動服務器的命令列引數,

var OBJ = DATABASE.serverCmdLineOpts();

回傳包括以下欄位:

  • argv:啟動服務器的命令列引數陣列,
  • parsed:決議后的命令列引數,
    • net:網路引數,
      • port:埠,
    • replication:副本集引數,
      • replSet:副本集名字,
    • storage:存盤引數,
      • dbPath:資料目錄,

DB.prototype.serverStatus

獲取服務器狀態,

var OBJ = DATABASE.serverStatus();

DB.prototype.setProfilingLevel

設定資料庫的系統分析器等級,

var OBJ = DATABASE.setProfilingLevel(LEVEL <, SLOW_MS>);

LEVEL可為:0為關閉系統分析器,1為只記錄慢查詢,2為記錄所有操作,

SLOW_MS為慢查詢閾值,單位為毫秒,不要設定得過小,即使系統分析器關閉,慢查詢也可能被記錄下來,

回傳包括以下欄位:

  • sampleRate
  • slowms:此前的慢查詢閾值,
  • was:此前的等級,

此方法的設定會在服務器重啟后被清除,

DB.prototype.shutdownServer

停止服務器,必需運行在admin資料庫上,

var RETURN = DATABASE.shutdownServer(<OPTION>);

OPTION可使用以下欄位:

  • force:是否強制停止,
  • timeoutSecs:停止主節點時等待備份節點追趕的超時秒數,

只當停止失敗時,才有回傳值,其為一個字串,

DB.prototype.stats

查看資料庫的狀態,在一個繁忙的系統上列出資料庫的狀態會非常慢,而且會阻礙其他操作,

var OBJ = DATABASE.stats(<SCALE_FACTOR>);

SCALE_FACTOR為比例因子(scale factor),回傳檔案的欄位數值會先除以SCALE_FACTOR,默認為1,即以1位元組為單位,

  • avgObjSize:
  • collections:集合數量,
  • dataSize:資料占用的空間大小,包括檔案間的間隔,不包括空閑串列(free list)的空間,該值與storageSize的差為被洗掉檔案的大小,
  • db:資料庫名稱,
  • fileSize:為資料庫檔案分配的總空間大小,包括預分配檔案的大小,該值應該是最大的,等于資料目錄中所有以資料庫名開頭的檔案大小合計,
  • indexes:
  • indexSize:
  • nsSizeMB:.ns檔案的大小,
  • objects:所有集合的檔案數量合計,
  • storageSize:資料庫正在使用的總空間大小,該值應該是次大的,與fileSize的差即為預分配檔案及前一個檔案未使用部分大小之和,

DB.prototype.version

獲取服務器版本,

var VERSION = DATABASE.version();

DBCollection

集合型別,

DBCollection.prototype.aggregate

聚合,

var DOCS = DBCOLLECTION.aggregate(PIPELINE_DOC <, ...>);

PIPELINE_DOC可使用以下管道運算子:

  • $group:分組,$group: {_id: "$INPUT_KEY"|{KEY: "$INPUT_KEY" <, ...>} <, OTHER_KEY: EXPR_DOC <, ...>>}_id指定分組鍵,也是輸出檔案的_id值,"$INPUT_KEY"見DBCollection.prototype.find,EXPR_DOC可以使用以下分組運算式,其EXPR可以直接指定值,可以使用"$INPUT_KEY"來指定鍵的值:

    算數運算子:

    • $avg:回傳分組中EXPR平均值,$avg: EXPR
    • $sum:回傳分組中EXPR總和,$sum: EXPR

    極值運算子:

    • $first:回傳分組中第一個EXPR,$first: EXPR
    • $last:回傳分組中最后一個EXPR,$last: EXPR
    • $max:回傳分組中最大的EXPR,$max: EXPR
    • $min:回傳分組中最小的EXPR,$min: EXPR

    陣列運算子:

    • $addToSet:若陣列不包含EXPR,則將其添加到陣列中,$addToSet: EXPR,陣列中元素的順序是不確定的,
    • $push:無論EXPR為何值,都將其添加到陣列中,$push: EXPR
  • $limit:限制,$limit: N,結果集只取前N個檔案,

  • $match:匹配,$match: QUERY_DOC,QUERY_DOC見DBCollection.prototype.find,但不可以使用地理空間運算子,

  • $project:投射,$project: PROJECTION_DOC,PROJECTION_DOC見DBCollection.prototype.find

  • $skip:跳過,$skip: N,跳過結果集的前N個檔案,

  • $sort:排序,$sort: SORT_DOC,SORT_DOC見DBQuery.prototype.sort

  • $unwind: 拆分,$unwind: "$ARRAY_KEY",根據陣列鍵中的每一個值拆分為單獨的檔案,如果陣列有N個元素,則拆分成N個檔案,此鍵依次替換成各個陣列元素,并包含原檔案中的其他鍵,

回傳的DOCS實作了forEach方法,

DBCollection.prototype.convertToCapped

將集合轉換成固定集合,

var OBJ = DBCOLLECTION.convertToCapped({size: N_BYTES});

DBCollection.prototype.count

回傳檔案的數量,

var N = DBCOLLECTION.count(<QUERY_DOC>);

QUERY_DOC見DBCollection.prototype.find,當不指定QUERY_DOC時,即查詢檔案的總數,無論集合有多大,都可以很快回傳,

DBCollection.prototype.createIndex

創建索引,

var OBJ = DBCOLLECTION.createIndex(INDEX_DOC <, INDEX_OPTION_DOC>);

INDEX_DOC為{KEY: 1|-1|"hashed"|"text"|"2d"|"2dsphere" <, ...>},1為升序,-1為降序,hashed為散列索引,text為全文本索引,2d或2dsphere為地理空間索引,如指定多個鍵,則為按指定鍵順序的復合索引,

2d索引需建立在值為[X, Y]形式的欄位上,

2dsphere索引需建立在值為GeoJSON的欄位上,GeoJSON的語法如下:

  • 點:{type: "Point", coordinates: [X, Y]}
  • 線:{type: "Line", coordinates: [[X1, Y1], [X2, Y2] <, ...>]}
  • 多邊形:{type: "Polygon", coordinates: [[X1, Y1], [X2, Y2] <, ...>]}

INDEX_OPTION_DOC中可使用以下欄位:

  • background:為true或1,則在后臺創建索引,
  • default_language:為全文本索引指定分詞語言,默認為english,如插入的檔案有language欄位,則分詞語言會被其值覆寫,
  • expireAfterSeconds:指定超時秒數,創建為TTL索引,
  • max:指定索引邊界的最大值,2d索引默認為180,
  • min:指定索引邊界的最小值,2d索引默認為-180,
  • name:指定索引名,
  • sparse:為true或1,則創建為稀疏索引,
  • unique:為true或1,則創建為唯一索引,
  • weights:為全文本索引不同的欄位指定權重,如:weights: {KEY|$**: WEIGHT <, ...>}$**表示所有字串欄位,包括內嵌字段,權重范圍為1至1000000000,默認為1,

DBCollection.prototype.deleteMany

洗掉多個檔案,

var OBJ = DBCOLLECTION.deleteMany(QUERY_DOC);

QUERY_DOC見DBCollection.prototype.find

回傳包括以下欄位:

  • acknowledged:是否已確認寫入,
  • deletedCount:被洗掉檔案的數量,

DBCollection.prototype.deleteOne

洗掉單個檔案,

var OBJ = DBCOLLECTION.deleteOne(QUERY_DOC);

QUERY_DOC見DBCollection.prototype.find

回傳包括以下欄位:

  • acknowledged:是否已確認寫入,
  • deletedCount:被洗掉檔案的數量,

DBCollection.prototype.distinct

欄位排重,如果欄位是陣列,則會使用陣列元素進行排重,

var VALUE_ARR = DBCOLLECTION.distinct(KEY);

DBCollection.prototype.drop

洗掉集合,

var BOOL = DBCOLLECTION.drop();

DBCollection.prototype.dropIndex

洗掉索引,

var OBJ = DBCOLLECTION.dropIndex(INDEX_NAME);

INDEX_NAME為DBCollection.prototype.getIndexes回傳的name欄位的值,

DBCollection.prototype.find

查找檔案,

var DBQUERY = DBCOLLECTION.find(<QUERY_DOC <, PROJECTION_DOC>>);
DBCOLLECTION.find(<QUERY_DOC <, PROJECTION_DOC>>);

QUERY_DOC為查找的匹配條件,各鍵值對的關系是與,可使用:

  • KEY:鍵的匹配條件,可以使用a.b的形式指定內嵌檔案(可為陣列)的欄位;可以使用a.INDEX的形式通過下標指定陣列元素,KEY: VALUE|CONDITION_DOC,VALUE為null還可匹配鍵不存在的情況;VALUE為子檔案或陣列則進行精確匹配,與欄位的順序和數量有關,CONDITION_DOC可使用以下運算子:

    • $all:全包含,$all: [VALUE <, ...>]
    • $elemMatch:陣列元素匹配,$elemMatch: CONDITION_DOC,只匹配陣列,存在元素與CONDITION_DOC匹配則陣列匹配,CONDITION_DOC中的鍵為陣列元素子檔案的鍵,
    • $eq:等于,$eq: VALUE
    • $exists:存在,$exists: BOOL,實際上,0和false表示false,其他值都表示true,注意,欄位值為null也為存在,
    • $gt:大于,$gt: VALUE
    • $gte:大于等于,$gte: VALUE
    • $in:在其中,$in: [VALUE <, ...>],回傳檔案的順序與VALUE的順序無關,
    • $lt:小于,$lt: VALUE
    • $lte:小于等于,$lte: VALUE
    • $ne:不等于,$ne: VALUE
    • $nin:不在其中,$nin: [VALUE <, ...>]
    • $not:取反,$not: CONDITION_DOC
    • $mod:取余,$mod: [DIVISOR, REMAINDER]
    • $size:陣列長度,$size: N

    也可以使用以下地理空間運算子(GEOJSON使用GeoJSON語法,見DBCollection.prototype.createIndex):

    • $geoIntersects:查找與區域相交的檔案,
      • 使用2dsphere索引:$geoIntersects: {$geometry: GEOJSON}
    • $near:查找在區域附近的檔案,由近至遠排序,
      • 使用2dsphere索引:$near: {$geometry: GEOJSON}
      • 使用2d索引:$near: [X, Y]
    • $within:查找在區域之內的檔案,
      • 使用2dsphere索引:$within: {$geometry: GEOJSON}
      • 使用2d索引,只要某個點在區域之內就匹配:$within: 2D_SHAPE,2D_SHAPE可使用以下運算子表示形狀:
        • $box:矩形,$box: [[X1, Y1], [X2, Y2]]
        • $center:圓形,$center: [[X, Y], R]
        • $polygon:多邊形,$polygon: [[X, Y] <, ...>]
  • $and:與,$and: [CONDITION_DOC <, ...>]

  • $nor:都不,$nor: [CONDITION_DOC <, ...>]

  • $or:或,$or: [CONDITION_DOC <, ...>]

  • $text:使用全文本索引查詢,$text: SEARCH_DOC,SEARCH_DOC可使用以下運算子:

    • $search:指定搜素條件,$search: SEARCH,SEARCH以空格分隔成若干個搜索詞,各搜素詞是或的關系,如搜索詞以""引起表示必需匹配該詞,如搜索詞以-開頭表示排除該詞,
  • $where:執行任意查詢,$where: FUNCTION,FUNCTION中的this為當前遍歷的檔案,回傳true表示匹配,否則表示不匹配,

PROJECTION_DOC為查找結果欄位的投射方式,{KEY: VALUE, <, ...>},對于KEY,若QUERY_DOC使用a.b進行查詢,則可以通過定位運算子$以a.$的形式指定已匹配的陣列元素,但只能指定第一個匹配的陣列元素,VALUE可為:

  • 0:不投射該鍵,KEY: 0,未指定的鍵都投射,如有一個非_id鍵指定為0,則所有鍵不能再指定為非0數值,除非使用_id: 0,否則_id會被自動投射,

  • 非0數值:投射該鍵,KEY: N,未指定的鍵不投射,

  • $slice:投射陣列的切片子集,KEY: {$slice: N|[OFFSET, COUNT]},N為正數則保留開頭元素,為負數則保留末尾元素,0則為空陣列,未指定的鍵都投射,

  • "$INPUT_KEY":使用檔案指定鍵的值進行投射,類似鍵重命名,`KEY: "$INPUT_KEY",INPUT_KEY的形式與QUERY_DOC中KEY的形式一樣,

  • 運算式:KEY: EXPR_DOC,EXPR_DOC可以使用以下運算式,其EXPR可以直接指定值,可以使用"$INPUT_KEY"來指定鍵的值,可以使用任意深度嵌套的運算式:

    數學運算式,接收數值型別,回傳數值型別:

    • $add:相加,$add: [EXPR <, ...>]
    • $subtract:相減,$subtract: [EXPR1, EXPR2],回傳EXPR1-EXPR2,
    • $multiply:相乘,$multiply: [EXPR <, ...>]
    • $divide:相除,$divide: [EXPR1, EXPR2],回傳EXPR1/EXPR2,
    • $mod:取余,$mod: [EXPR1, EXPR2],回傳EXPR1%EXPR2,

    日期表達式,接收日期型別,回傳數值型別:

    • $dayOfMonth:回傳在當前月的第幾天,$dayOfMonth: EXPR
    • $dayOfWeek:回傳在當前星期的第幾天,星期天為第一天,$dayOfWeek: EXPR
    • $dayOfYear:回傳在當前年的第幾天,$dayOfYear: EXPR
    • $hour:回傳小時,二十四小時制,$hour: EXPR
    • $minute:回傳分鐘,$minute: EXPR
    • $month:回傳月份,$month: EXPR
    • $second:回傳秒,$second: EXPR
    • $week:回傳在當前年的第幾個星期,第一個星期是從當前年的第一個星期天開始,$week: EXPR
    • $year:回傳年,$year: EXPR

    字串運算式,接收字串型別,回傳字串型別:

    • $concat:連接字串,$concat: [EXPR <, ...>]
    • $substr:截取子串,$substr: [EXPR, START_OFFSET, LENGTH],從START_OFFSET位元組(含)開始截取LENGTH位元組
    • $toLower:回傳字串小寫,$toLower: EXPR
    • $toUpper:回傳字串大寫,$toUpper: EXPR

    邏輯運算式,包括:

    1. 比較運算式:

      • $cmp:比較,$cmp: [EXPR1, EXPR2],若EXPR1<EXPR2,回傳負數;若EXPR1==EXPR2,回傳0;若EXPR1>EXPR2,回傳正數,
      • $eq:相等,$eq: [EXPR1, EXPR2],回傳EXPR1==EXPR2,
      • $gt:大于,$gt: [EXPR1, EXPR2],回傳EXPR1>EXPR2,
      • $gte:大于等于,$gte: [EXPR1, EXPR2],回傳EXPR1>=EXPR2,
      • $lt:小于,$lt: [EXPR1, EXPR2],回傳EXPR1<EXPR2,
      • $lte:小于等于,$lte: [EXPR1, EXPR2],回傳EXPR1<=EXPR2,
      • $ne:不等于,$ne: [EXPR1, EXPR2],回傳EXPR1!=EXPR2,
      • $strcasecmp:字串比較,區分大小寫,$strcasecmp: [EXPR1, EXPR2],接收字串型別,回傳結果類似$cmp
    2. 布爾運算式,接收布爾型別,回傳布爾型別:

      • $and:且,$and: [EXPR <, ...>]
      • $not:非,$not: EXPR
      • $or:或,$or: [EXPR <, ...>]
    3. 控制陳述句:

      • $cond:判斷條件,$cond: [BOOL_EXPR, EXPR_WHILE_TRUE, EXPR_WHILE_FALE]:若BOOL_EXPR為true,則回傳EXPR_WHILE_TRUE,否則回傳EXPR_WHILE_FALE,
      • $ifNull:判斷空值,$ifNull: [EXPR, REPLACEMENT_EXPR]:若EXPR為null,則回傳REPLACEMENT_EXPR,否則回傳EXPR,
  • 其他:投射該鍵為VALUE,KEY: VALUE

回傳DBQuery型別,如不接識訓傳,則默認列印前20個檔案,若需繼續遍歷則使用輔助擴展it

DBCollection.prototype.findAndModify

查找并更新檔案,只會更新一個檔案,

var RESULT_DOC = DBCOLLECTION.findAndModify({
	query: QUERY_DOC
	<, sort: SORT_DOC>
	<, remove: BOOL>
	<, update: DOC|MODIFIER_DOC>
	<, upsert: BOOL>
	<, new: BOOL>
	<, fields: PROJECTION_DOC>
});
  • fields:回傳結果包含的欄位,PROJECTION_DOC見DBCollection.prototype.find
  • new:true回傳更新后的檔案,false回傳更新前的檔案,預設為false,
  • query:查找規則,QUERY_DOC見DBCollection.prototype.find
  • remove:true為洗掉檔案,false為更新檔案,默認為false,removeupdate必須使用其一,
  • sort:排序規則,SORT_DOC見DBQuery.prototype.sort
  • update:更新規則,DOC和MODIFIER_DOC見DBCollection.prototype.updateremoveupdate必須使用其一,
  • upsert:是否執行upsert,

DBCollection.prototype.findOne

查找單個檔案,

var DOC = DBCOLLECTION.findOne(<QUERY_DOC <, PROJECTION_DOC>>);

QUERY_DOC見DBCollection.prototype.find

PROJECTION_DOC見DBCollection.prototype.find

回傳的檔案經過格式化,如找不到,則回傳null

DBCollection.prototype.getIndexes

查看集合的所有索引資訊,

var ARR = DBCOLLECTION.getIndexes();

回傳的陣列元素包括以下欄位:

  • key:索引的鍵,即DBCollection.prototype.createIndex中創建索引的INDEX_DOC,
  • name:索引名,默認為根據DBCollection.prototype.createIndex中INDEX_DOC生成的KEY_DIRECTION[_...]的形式,
  • v:索引版本,

DBCollection.prototype.help

查看集合的幫助,

DBCOLLECTION.help();

DBCollection.prototype.insert

插入檔案,

var WRITERESULT = DBCOLLECTION.insert(DOC <, OPTION>);
var BULKWRITERESULT = DBCOLLECTION.insert([DOC <, ...>] <, OPTION>);

OPTION可使用以下欄位:

  • writeConcern:寫入安全配置,writeConcern: WRITE_CONCERN_DOC,WRITE_CONCERN_DOC可使用以下欄位:
    • j:
    • w:等待資料庫寫入成功才回傳,整數N為寫入至少N個節點(包括主節點),"majority"為寫入大多數節點,或為自定義復制保證規則名字(見rs.initiate的GET_LAST_ERROR_MODES_NAME),
    • wtimeout:寫入超時,單位為毫秒,超時后回傳失敗,此時并不意味著寫操作失敗,只是表明寫操作未復制到足夠多的節點,

插入單個檔案時,類似DBCollection.prototype.insertOne,回傳WriteResult型別,

插入多個檔案時,類似DBCollection.prototype.insertMany,回傳BulkWriteResult型別,

DBCollection.prototype.insertMany

插入多個檔案,如其中某個檔案插入失敗,則之前的都插入成功,之后的都插入失敗,且會拋出例外,

var OBJ = DBCOLLECTION.insertMany([DOC <, ...>]);

回傳包括以下欄位:

  • acknowledged:是否已確認寫入,
  • insertedIds:被插入檔案的_id值的陣列,如DOC未指定則自動添加,

DBCollection.prototype.insertOne

插入單個檔案,

var OBJ = DBCOLLECTION.insertOne(DOC);

回傳包括以下欄位:

  • acknowledged:是否已確認寫入,
  • insertedId:被插入檔案的_id值,如DOC未指定則自動添加,

DBCollection.prototype.mapreduce

執行MapReduce,

var RESULT = DBCOLLECTION.mapreduce(MAP, REDUCE, OUTPUT_COLLECTION_NAME|OPTION_DOC);

MAP是一個函式,this表示當前正在處理的檔案:

function () {
	emit(KEY, VALUE);
}

REDUCE是一個函式,一定要能夠在map階段的結果或前一個reduce階段的結果上反復執行,因此回傳的檔案必須能作為VALUE_ARR的一個元素:

function(KEY, VALUE_ARR) {
	return VALUE;
}

OPTION_DOC可使用以下欄位:

  • finalize:將reduce的結果進行最后處理,finalize: FINALIZE,FINALIZE是一個函式:

    function(KEY, VALUE) {
    	return FINALIZE_VALUE;
    }
    
  • limit:執行map之前限制檔案的最多數量(含),1limit: N`,

  • out:結果集合名,out: OUTPUT_COLLECTION_NAME,必需此欄位,

  • query: 執行map之前的查找規則,query: QUERY_DOC,QUERY_DOC見DBCollection.prototype.find

  • scope:變數作用域,scope: {PARAM_NAME: PARAM_VALUE <, ...>},其他函式可以直接使用PARAM_NAME來使用作用域中的變數,

  • sort:執行map之前的排序規則,sort: SORT_DOC,SORT_DOC見DBQuery.prototype.sort

會先清空結果集,結果集合中的每個檔案包括以下欄位:

  • _id:鍵,即MAP或REDUCE的KEY,
  • value:值,即REDUCE的最終VALUE,如果指定了FINALIZE則為其回傳的FINALIZE_VALUE,

可以在MAP、REDUCE、FINALIZE中使用print將資訊輸出至服務器日志,

DBCollection.prototype.remove

洗掉檔案,

var WRITERESULT = DBCOLLECTION.remove(QUERY_DOC <, BOOL_ONE>);

QUERY_DOC見DBCollection.prototype.find

回傳WriteResult型別,

DBCollection.prototype.renameCollection

重命名集合,無論集合有多大都在瞬間完成,

var OBJ = DBCOLLECTION.renameCollection(NEW_COLLECTION_NAME <, REMOVE_EXISTING>);

若集合NEW_COLLECTION_NAME已存在,REMOVE_EXISTING為true則先洗掉該集合;為false則回傳失敗,默認為false,

DBCollection.prototype.save

保存檔案,如果DOC沒有_id或集合中無該_id值的檔案,則插入檔案;否則更新該_id值的檔案,

var WRITERESULT = DBCOLLECTION.save(DOC);

回傳WriteResult型別,

DBCollection.prototype.stats

查看集合的狀態,

var OBJ = DBCOLLECTION.stats(<SCALE_FACTOR>);

SCALE_FACTOR為比例因子(scale factor),回傳檔案的欄位數值會先除以SCALE_FACTOR,默認為1,即以1位元組為單位,

回傳檔案的欄位如下:

  • avgObjSize:檔案的平均大小,相當于size/count,
  • count:檔案的數量,
  • indexSizes:各索引的大小,其鍵為各索引名,其值為各索引的大小,
  • nindexes:索引的數量,索引在建立完成后才會被算入其中,
  • ns:集合的命名空間,
  • paddingFactor:填充因子,
  • size:所有檔案的大小合計,相當于所有檔案執行Object.bsonsize的總和,
  • storageSize:集合占用的存盤空間大小,包括檔案占用的空間、檔案間的間隔、索引占用的空間、集合兩端預留的未使用空間,
  • totalIndexSize:所有索引的大小合計,相當于indexSizes各值的總和,

DBCollection.prototype.update

更新檔案,

var WRITERESULT = DBCOLLECTION.update(QUERY_DOC, DOC <, BOOL_UPSERT <, BOOL_MANY>>);
var WRITERESULT = DBCOLLECTION.update(QUERY_DOC, MODIFIER_DOC <, BOOL_UPSERT <, BOOL_MANY>>);

不可更新_id欄位,

QUERY_DOC見DBCollection.prototype.find

可以將檔案替換成DOC,

也可以在MODIFIER_DOC使用更新修改器修改部分欄位,更新修改器可使用:

  • $inc:增加或減少鍵的值,鍵不存在則先創建為0,$inc: {KEY: NUMBER <, ...>},只能用于數值型別的鍵,
  • $set:設定鍵的值,鍵不存在則創建,$set: {KEY: VALUE <, ...>}
  • $setOnInsert:當更新需插入檔案時,同時設定鍵的值;只更新不插入檔案時,不進行設定,$setOnInsert: {KEY: VALUE <, ...>}
  • $unset:洗掉鍵,$unset: {KEY: 1 <, ...>},值是無關的,

以及陣列修改器:

  • $addToSet:將陣列作為集合,保證元素不重復,向末尾推入元素,鍵不存在則先創建為空陣列,$addToSet: {ARR_KEY: ELEMENT|EACH_DOC <, ...>},只能用于陣列型別的鍵,EACH_DOC可使用以下子運算子:
    • $each:推入多個元素,$each: [ELEMENT <, ...>]
  • $pop:從陣列彈出單個元素,$pop: {ARR_KEY: 1|-1},1為從開頭彈出,-1為從結尾彈出,只能用于陣列型別的鍵,
  • $pull:從陣列徹底洗掉元素,即使元素出現多次,$pull: {ARR_KEY: ELEMENT}
  • $push: 向陣列末尾推入元素,鍵不存在則先創建為空陣列,$push: {ARR_KEY: ELEMENT|PUSH_EACH_DOC <, ...>},只能用于陣列型別的鍵,PUSH_EACH_DOC可使用以下子運算子:
    • $each: 推入多個元素,$each: [ELEMENT <, ...>]
    • $slice:推入元素按需排序后,保留多少個元素,$slice: N,正數則保留開頭元素,負數則保留末尾元素,0則清空,需與$each一起使用,
    • $sort:推入元素后,排序,$sort: {ELEMENT_KEY: 1|-1},ELEMENT_KEY為陣列元素的鍵,1為升序,-1為降序,需與$each一起使用,

上述KEY等鍵可以使用a.b的形式指定內嵌檔案(可為陣列)的欄位;可以使用a.INDEX的形式通過下標指定陣列元素;若QUERY_DOC使用a.b進行查詢,則可以通過定位運算子$以a.$的形式指定已匹配的陣列元素,但只能更新第一個匹配的陣列元素,

如BOOL_UPSERT為true(預設為false),則執行upsert,即,查詢條件QUERY_DOC匹配不到檔案時,先使用QUERY_DOC創建檔案,再使用DOC或MODIFIER_DOC修改檔案,最后將檔案插入,

如BOOL_MANY為true(預設為false),則更新所有匹配查詢條件QUERY_DOC的檔案,否則只更新第一個檔案,

回傳WriteResult型別,

DBCollection.prototype.updateMany

更新多個檔案,

var OBJ = DBCOLLECTION.updateMany(QUERY_DOC, MODIFIER_DOC);

QUERY_DOC見DBCollection.prototype.find

MODIFIER_DOC見DBCollection.prototype.update

回傳包括以下欄位:

  • acknowledged:是否已確認寫入,
  • matchedCount:匹配的檔案數量,
  • modifiedCount:修改的檔案數量,

DBCollection.prototype.updateOne

更新單個檔案,

var OBJ = DBCOLLECTION.updateOne(QUERY_DOC, MODIFIER_DOC);

QUERY_DOC見DBCollection.prototype.find

MODIFIER_DOC見DBCollection.prototype.update

回傳包括以下欄位:

  • acknowledged:是否已確認寫入,
  • matchedCount:匹配的檔案數量,
  • modifiedCount:修改的檔案數量,

DBCollection.prototype.validate

檢驗集合資料是否有效,即是否沒有損壞,

var OBJ = DBCOLLECTION.validate(<{full: true}>);

如指定了{full: true},則進行更完整的檢驗,

回傳包括以下欄位:

  • valid:資料是否有效,

DBQuery

查詢游標型別,

DBQuery.prototype.explain

獲取執行計劃,

var OBJ = DBQUERY.explain();

回傳包括以下欄位:

  • ok:是否成功得出執行計劃,
  • queryPlanner:執行計劃,
    • parsedQuery:被決議過的查詢條件,
    • rejectedPlans:拒絕的執行計劃,
    • winningPlan:勝出的執行計劃,
      • inputStage
        • stage
        • keyPattern
        • indexName
        • isMultiKey:是否是多鍵索引,
        • multiKeyPaths
        • isUnique
        • isSparse
        • isPartial
        • indexVersion
        • direction
        • indexBounds
      • shards:使用到的分片的執行計劃組成的陣列,
      • stage
  • serverInfo:服務器資訊,

DBQuery.prototype.forEach

遍歷所有檔案,

DBQUERY.forEach(DOC => {});

DBQuery.prototype.hasNext

是否還有下一個檔案,

var BOOL = DBQUERY.hasNext();

DBQuery.prototype.hint

使用指定的索引,

var DBQUERY2 = DBQUERY.hint(HINT_DOC);

HINT_DOC為{KEY: 1|-1 <, ...>},1為升序,-1為降序,如指定多個鍵,則為按指定鍵順序的復合索引,或為{$natural: 1|-1}使用自然排序,進行全表掃描,

DBQuery.prototype.limit

限制檔案的最多數量(含),

var DBQUERY2 = DBQUERY.limit(N);

DBQuery.prototype.min

指定索引的最小值(含),必須與DBQuery.prototype.hint一起使用,

var DBQUERY2 = DBQUERY.min({KEY: VALUE <, ...>});

DBQuery.prototype.max

指定索引的最大值(含),必須與DBQuery.prototype.hint一起使用,

var DBQUERY2 = DBQUERY.max({KEY: VALUE <, ...>});

DBQuery.prototype.next

回傳下一個檔案,

var DOC = DBQUERY.next();

回傳的檔案經過格式化,

DBQuery.prototype.pretty

以優美的格式顯示,

var DBQUERY2 = DBQUERY.pretty()

DBQuery.prototype.skip

跳過若干數量的檔案,

var DBQUERY2 = DBQUERY.skip(N);

DBQuery.prototype.sort

對檔案進行排序,

var DBQUERY2 = DBQUERY.sort(SORT_DOC);

SORT_DOC可使用{KEY: 1|-1 <, ...>},1為升序,-1為降序,按照各KEY指定的次序逐個排序,或為{$natural: 1|-1}使用自然排序,

DBQuery.prototype.toArray

遍歷所有檔案并以陣列回傳,

var ARR = DBQUERY.toArray();

EDITOR

edit輔助擴展使用的編輯器路徑,也可在環境變數中設定,

var EDITOR = "EDITOR_PATH";

ISODate

創建UTC時間,

var DATE = new ISODate();
var DATE = new ISODate(STR);

STR最完整的格式為:2006-01-02T15:04:05.000Z,

回傳Date型別,

load

加載并執行腳本,

load(JS_FILENAME);

相對路徑根據shell運行目錄,且無法識別主目錄“~”,

MaxKey

最大值,值為{ "$maxKey" : 1 }

MinKey

最小值,值為{ "$minKey" : 1 }

Mongo

連接型別,

new Mongo

創建連接,

var MONGO = new Mongo(HOST_PORT);

Mongo.prototype.getDB

獲取資料庫,

var DATABASE = MONGO.getDB(DB_NAME);

回傳DB型別,

Mongo.prototype.getDBs

獲取所有資料庫資訊,類似show dbs

var OBJ = MONGO.getDBs();

Mongo.prototype.setSlaveOk

允許連接從備份節點讀取資料,

MONGO.setSlaveOk()

默認不允許連接從備份節點讀取資料,否則會出現“not master and slaveOk=false”的錯誤,

NumberInt

32位有符號整數型別,

var NUMBERINT = new NumberInt(N);

NumberLong

64位有符號整數型別,

var NUMBERLONG = new NumberLong(N);

Object

物件型別,

額外添加以下介面:

Object.bsonsize

獲取物件的BSON位元組大小,

var N = Object.bsonsize(DOC);

ObjectId

物件ID型別,由12位元組組成,依次為:4位元組秒級時間戳、3位元組主機唯一識別符號(通常是主機名的散列值)、2位元組行程ID、3位元組自增計數器,

var OBJECTID = new ObjectId();
var OBJECTID = new ObjectId(HEX_STR);

OBJECTID.str

物件ID的16進制字串,

ObjectId.prototype.getTimestamp

回傳物件ID的時間戳對應的時間,

var DATE = OBJECTID.getTimestamp();

print

列印輸出,

print(<ARG <, ...>>);

printjson

以JSON格式列印輸出,

printjson(ARG);

prompt

shell提示,

var prompt = "STR";
var prompt = function() {return "STR";};

為字串或回傳字串的函式,如為函式,建議處理例外,

run

執行外部命令列程式,

run(COMMAND <, ARG <, ...>>);

ReplSetTest

副本集型別,

new ReplSetTest

創建副本集,并不會創建資料庫檔案和啟動行程,也不會從備份節點中選舉出主節點,需依次執行REPLSETTEST.startSetREPLSETTEST.initiate

var REPLSETTEST = new ReplSetTest(OPTION);

OPTION包括以下欄位:

  • name:副本集名字,預設則使用“unknown_name”,
  • nodes:節點的個數,

REPLSETTEST.initiate

初始化副本集,會從備份節點中選舉出主節點,類似rs.initiate

REPLSETTEST.initiate(<REPL_CONFIG>);

REPL_CONFIG見rs.initiate

REPLSETTEST.startSet

啟動副本集,會先洗掉原有資料庫目錄,再創建資料庫目錄和檔案,啟動所有副本集行程,同時會不斷輸出所有節點的日志,

var ARR = REPLSETTEST.startSet();

ARR的各個元素包含節點的地址,

各節點的資料庫目錄名為“副本集名-節點序號”的形式,

REPLSETTEST.stopSet

停止副本集,會停止所有副本集行程,

REPLSETTEST.stopSet();

rs

副本集輔助函式,

rs.add

為副本集添加節點,

var OBJ = rs.add(HOST_PORT|REPL_MEMBER);

REPL_MEMBER見rs.initiate

此節點的資料目錄要么是空的,要么擁有一份其他節點的資料副本,

rs.addArb

為副本集添加仲裁者,

var OBJ = rs.addArb(HOST_PORT);

rs.config

查看副本集配置,可見隱藏節點,

var REPL_CONFIG = rs.config();

REPL_CONFIG見rs.initiate,此外還包括以下欄位:

  • version:版本號,每次修改副本集配置都會自增1,初始值為1,

rs.freeze

凍結備份節點,只能在備份節點上執行,

var OBJ = rs.freeze(<SECONDS>);

SECONDS為持續時間,如大于0,則強制其在指定時間內始終為備份節點,不能被選舉為主節點,如為0,則解除凍結,如不指定,默認為0,

rs.help

查看副本集輔助函式的幫助,

rs.help();

rs.initiate

初始化副本集,會從備份節點中選舉出主節點,

var OBJ = rs.initiate(<REPL_CONFIG>);

REPL_CONFIG包括以下欄位:

  • _id:副本集名字,必需和服務器啟動時設定的副本集名字一致,
  • members:副本集成員節點陣列,每個元素REPL_MEMBER包括以下欄位:
    • _id:節點ID,數值型別,可選,必需唯一,
    • arbiterOnly:是否為仲裁者,可選,
    • buildIndexes:是否創建索引,可選,priority必需為0,
    • hidden:是否為隱藏節點,可選,priority必需為0,
    • host:節點主機和埠地址,必需唯一,
    • priority:優先級,可選,0至100優先級遞增,
    • slaveDelay:是否為延遲備份節點,可選,priority必需為0,
    • tags:分類標簽,tags: {REPL_TAG_KEY: VALUE <, ...>},可選,
    • votes:投票數量,為0,則阻止節點在選舉中投贊成票,但仍可投否決票,可選,應該只在創建包含7個(不含)以上節點的副本集或者希望阻止自動故障轉移時使用,
  • settings:包括以下欄位:
    • allowChaining:是否允許復制鏈,如為false,則強制每個備份節點都從主節點進行復制,可選,默認為true,
    • getLastErrorModes:自定義復制保證規則,getLastErrorModes: {GET_LAST_ERROR_MODES_NAME: {REPL_TAG_KEY: N} <, ...>},可選,表示保證復制至分類標簽REPL_TAG_KEY中至少N個不同的分類,每個分類的至少一個節點中,

如不使用REPL_CONFIG,則會自動生成單節點副本集的配置,配置中自動生成的members.host欄位可能并不適用,

如果創建一個全新的副本集,可以在任意一個節點上執行;如果副本集中已經有一個有資料的節點,則只能在此節點上執行;如果副本集中擁有資料的節點不止一個,則無法初始化副本集,

rs.reconfig

重新配置副本集,

var OBJ = rs.reconfig(REPL_CONFIG <, OPTION>);

REPL_CONFIG見rs.initiate,不能修改members._id

OPTION可使用以下欄位:

  • force:是否強制重新配置副本集,若為true,則只能在新配置下可能成為備份節點的節點上執行;否則,只能在新配置下可能成為主節點的節點上執行,默認為false,若為true,執行成功后,rs.config回傳的version欄位會大幅增加,

rs.remove

為副本集洗掉節點,

var OBJ = rs.remove(HOST_PORT);

rs.status

以當前節點的角度查看副本集所有節點的當前狀態,可見隱藏節點,

var OBJ = rs.status();

回傳包括以下欄位:

  • members:副本集成員節點狀態陣列,每個元素包括以下欄位:
    • _id:節點ID,
    • errmsg:節點在心跳請求中回傳當前節點的狀態資訊,通常不是錯誤資訊,
    • health:當前節點是否可達此節點,可達為1,不可達為0,
    • lastHeartbeat:當前節點最后收到此節點心跳的時間,
    • name:節點主機和埠地址,
    • optime:節點oplog中最后一個操作發生的時間(也就是操作被同步的時間),與optimeDate一致,這是其他節點通過心跳報告過來的,和實際會有偏差,
    • optimeDate:節點oplog中最后一個操作發生的時間(也就是操作被同步的時間),與optime一致,這是其他節點通過心跳報告過來的,和實際會有偏差,
    • pingMs:心跳從當前節點到達此節點所花費的平均時間,單位為毫秒,
    • self:是否是當前節點自身,只會出現在當前節點的元素中,
    • state:節點狀態的內部表示,與stateStr一致,
    • stateStr:節點狀態字串,與state一致,如:PRIMARY、SECONDARY,
    • uptime:當前節點可達此節點時起直到現在的時長,單位是秒,
  • set:副本集名字,
  • syncSourceHost:當前節點同步源的主機和埠地址,只當當前節點為備份節點時有值,

rs.stepDown

將主節點退位為備份節點,只能在主節點上執行,

var OBJ = rs.stepDown(<SECONDS>);

SECONDS為持續時間,如不指定,默認為60,

rs.syncFrom

修改當前節點的同步源,只能在備份節點上執行,

var OBJ = rs.syncFrom(HOST_PORT);

如果指定一個并不比當前節點領先的節點作為同步源,會給出警告,但仍然被允許,

sh

分片集群輔助函式,

sh.addShard

將副本集或單機增加為分片,

var OBJ = sh.addShard(REPLSET|HOST_PORT);

REPLSET的格式為:REPLSET_NAME/HOST_PORT<,...,HOST_PORT>,REPLSET_NAME會被用作分片名,不能和現有分片相同,如果副本集已有資料,會將其所有資料庫添加進分片集群中,但不能和現有分片有同名的資料庫,可指定任意個(并不需要所有)HOST_PORT,會自動檢測副本集所有節點,

如使用HOST_PORT,分片名的格式為shardNNNN,NNNN為4位整數,

sh.addShardTag

為分片添加標簽,

var OBJ = sh.addShardTag(SHARD_NAME, SHARD_TAG);

單個分片可添加的標簽數量沒有限制,

sh.addTagRange

為分片標簽添加范圍規則,

var OBJ = sh.addTagRange(COLLECTION_NAMESPACE, {SHARD_KEY: MIN <, ...>}, {SHARD_KEY: MAX <, ...>}, SHARD_TAG);

范圍包含MIN,不包含MAX,并不會立即生效,其只是一個對于均衡器的指令,

sh.enableSharding

對資料庫啟用分片,

var OBJ = sh.enableSharding(DB_NAME);

sh.getBalancerState

查看均衡器開啟狀態,

var BOOL = sh.getBalancerState();

sh.help

查看分片集群輔助函式的幫助,

sh.help();

sh.moveChunk

將包括指定片鍵值的塊移動到指定分片,移動完成后才回傳,

var OBJ = sh.moveChunk(COLLECTION_NAMESPACE, {SHARD_KEY: VALUE <, ...>}, SHARD_NAME);

除非遇到特殊情況,否則都應使用自動分片,而非手動分片,在均衡器開啟時尤其要注意,

sh.splitAt

在指定片鍵值處拆分塊,

var OBJ = sh.splitAt(COLLECTION_NAMESPACE, {SHARD_KEY: VALUE <, ...>});

sh.removeShardTag

洗掉分片標簽,

var OBJ = sh.removeShardTag(SHARD_NAME, SHARD_TAG);

sh.setBalancerState

設定均衡器開啟狀態,

var OBJ = sh.setBalancerState(BOOL);

不能立即終止進行中的均衡程序,

sh.shardCollection

對集合分片,

var OBJ = sh.shardCollection(COLLECTION_NAMESPACE, {SHARD_KEY: 1|"hashed" <, ...>});

如集合DB_NAME.COLLECTION_NAME已存在,則SHARD_KEY上必需有索引;否則,會自動在SHARD_KEY上創建索引,

如SHARD_KEY為hashed且集合不存在,會立即創建一些空塊,并將這些塊分發到分片集群中,如SHARD_KEY不為"hashed",則可能插入大量的檔案后才進行分片,

sh.status

查看分片集群的狀態,

sh.status(<true>);

如指定true則列印出詳細資訊,包括每個塊的資訊,

無回傳,會列印幾部分資訊:

  • sharding version

  • shards:分片資訊,每行一個檔案,每個檔案包括以下欄位:

    • _id:分片名,
    • host:主機地址,格式為SHARD_NAME/HOST_PORT,
    • state:狀態,
    • tags:分片標簽陣列,
  • active mongoses

  • autosplit

  • balancer:

  • databases:資料庫資訊,可能有若干份資料庫資訊,

    每份資料庫資訊以一個檔案開始,檔案包括以下欄位:

    • _id:資料庫名,

    • primary:主分片名,

    • partitioned:是否分片,

      此后是若干個集合的分片資訊,以集合名為起始行,

      集合的分片資訊幾部分:

      • shard key:片鍵,

      • unique:是否唯一,

      • balancing:是否啟用均衡器,

      • chunks:塊資訊,包括兩部分:

        第一部分是此集合使用的分片,每行一個,包括分片名、分片中使用的塊數量,

        第二部分是各個塊資訊,每行一個,包括“-->>”表示的塊范圍、所在的分片名、Timestamp(MAJOR, MINOR)的塊版本(MAJOR會在塊被遷移至新的分片時改變,MINOR會在塊被拆分時改變)、特大塊還有“jumbo”,

      • tag:分片標簽資訊,每行一個,包括標簽名,“-->>”表示的標簽范圍,

如mongod使用--noscripting選項啟動,則無法執行此方法,

ShardingTest

分片集群型別,

new ShardingTest

創建分片集群,會先洗掉原有資料庫目錄,再創建資料庫目錄和檔案,啟動mongos行程、配置副本集若干mongod行程、若干分片副本集的若干mongod行程,同時會不斷輸出所有節點的日志,

var SHARDINGTEST = new ShardingTest(OPTION);

OPTION包括以下欄位:

  • chunkSize:塊大小,單位為MB,
  • shards:分片數量,

各配置副本集節點的目錄名為“unknown_name-configRS-節點序號”的形式,各分片副本集節點的目錄名為“unknown_name-rs分片序號-節點序號”的形式,

SHARDINGTEST.stop

停止分片集群,會停止mongos行程、配置副本集所有mongod行程、所有分片副本集所有mongod行程,

SHARDINGTEST.stop();

startParallelShell

啟動新的并行shell并執行腳本,

var FUNC = startParallelShell(JS_CODE <, PORT>);

會列印腳本的執行結果,

Timestamp

時間戳型別,

new Timestamp

創建時間戳,

var TIMESTAMP = new Timestamp(<SECONDS, COUNTER>);

SECONDS為從1970-01-01 00:00:00起的秒數,

COUNTER為自定義的計數器,

WriteResult

單個寫入結果型別,包括以下欄位:

  • _id:執行upsert時插入檔案的_id
  • nMatched:匹配查詢條件的檔案數量,
  • nModified:修改的檔案數量,
  • nUpserted:執行upsert的檔案數量,
  • nInserted:插入的檔案數量,
  • nRemoved:洗掉的檔案數量,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/423150.html

標籤:NoSQL

上一篇:MySQL資料庫索引介紹

下一篇:Mysql-5.7主從部署-yum方式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more