MongoDB学习笔记:JavaScript shell
Posted garvenc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB学习笔记:JavaScript shell相关的知识,希望对你有一定的参考价值。
本文更新于2022-01-22,使用MongoDB 4.4.5。
- 辅助扩展
- BulkWriteResult
- db
- DB
- DATABASE.COLLECTION_NAME
- DB.prototype.adminCommand
- 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
- 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
- EDITOR
- ISODate
- load
- MaxKey
- MinKey
- Mongo
- NumberInt
- NumberLong
- Object
- ObjectId
- printjson
- prompt
- run
- ReplSetTest
- rs
- sh
- ShardingTest
- startParallelShell
- 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:数据目录。
- net:网络参数。
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
。
- $avg:返回分组中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
。
- 使用2dsphere索引:
- $near:查找在区域附近的文档,由近至远排序。
- 使用2dsphere索引:
$near: $geometry: GEOJSON
。 - 使用2d索引:
$near: [X, Y]
。
- 使用2dsphere索引:
- $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] <, ...>]
。
- $box:矩形。
- 使用2dsphere索引:
- $all:全包含。
-
$and:与。
$and: [CONDITION_DOC <, ...>]
。 -
$nor:都不。
$nor: [CONDITION_DOC <, ...>]
。 -
$or:或。
$or: [CONDITION_DOC <, ...>]
。 -
$text:使用全文本索引查询。
$text: SEARCH_DOC
。SEARCH_DOC可使用以下操作符:- $search:指定搜素条件。
$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
。
逻辑表达式,包括:
-
比较表达式:
- $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
。
- $cmp:比较。
-
布尔表达式,接收布尔类型,返回布尔类型:
- $and:且。
$and: [EXPR <, ...>]
。 - $not:非。
$not: EXPR
。 - $or:或。
$or: [EXPR <, ...>]
。
- $and:且。
-
控制语句:
- $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。
- $cond:判断条件。
- $add:相加。
-
其他:投射该键为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。
remove
和update
必须使用其一。 - sort:排序规则。SORT_DOC见
DBQuery.prototype.sort
。 - update:更新规则。DOC和MODIFIER_DOC见
DBCollection.prototype.update
。remove
和update
必须使用其一。 - 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 <, ...>]
。
- $each:推入多个元素。
- $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
一起使用。
- $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
- inputStage
- 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(<ARG <, ...>>);
printjson
以JSON格式打印输出。
printjson(ARG);
prompt
shell提示。
var prompt = "STR";
var prompt = function() return "STR";;
为字符串或返回字符串的函数。如为函数,建议处理异常。
run
执行外部命令行程序。
run(COMMAND <, ARG <, ...>>);
ReplSe
以上是关于MongoDB学习笔记:JavaScript shell的主要内容,如果未能解决你的问题,请参考以下文章