MongoDB学习笔记:JavaScript shell

Posted garvenc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB学习笔记:JavaScript shell相关的知识,希望对你有一定的参考价值。

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

目录

可于官网搜索相关文档: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 <, ...>>);

ReplSe

以上是关于MongoDB学习笔记:JavaScript shell的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 学习笔记之 手动预先分片

nodejs学习笔记二链接mongodb

Mongodb 学习笔记

MongoDB 学习笔记一: 配置

MongoDB学习笔记 MongoDB介绍及安装

MongoDB学习笔记