- 下载 MongoDB 的官方镜像
docker pull mongo:4
-
启动一个 MongoDB 服务器容器(参考
https://www.lmaye.com/2019/05/06/20190506232452/
和https://docs.docker.com/docker-for-mac/osxfs/
)sudo docker run -p 27017:27017 --name mymongo -v ~/Desktop/workspace/mymongo/data/:/data/db -d mongo:4
-
查看 docker 容器状态
docker ps
-
查看数据库服务器日志
docker logs mymongo
-
启动一个已经停止的容器
docker start 容器ID或容器名
-
优雅的停止正在运行的容器
docker stop 容器ID或容器名
-
直接关闭容器
docker kill 容器ID或容器名
-
重启一个容器
docker restart 容器ID或容器名
- 下载 mongo-express 镜像
docker pull mongo-express
- 运行 mongo-express
docker run —link mymongo:mongo -p 8081:8081 mongo-express
- 运行 mongo shell
docker exec -it mymongo mongo
-
db.collection.insertOne() 创建单一文档
db.collection.insertOne(<document>, { writeConcern: <document> }) * <document>: 要写入的文档本身 * writeConcern: 定义了文档创建操作的安全写级别。简单来说,安全写级别用来判断一次数据库写入操作是否成功。安全写级别越高,丢失数据的风险就越低,然而写入操作的延迟也可能更高。如果不提供writeConcern文档,mongoDB使用默认的安全写级别。
-
db.collection.insertMany() 创建多个文档
db.collection.insertMany([<document1>, <document2>, ...], { writeConcern: <document>, ordered: <boolean> } ) * ordered: 用来决定mongoDB是否要按顺序来写入这些文档 如果将ordered参数设置为false,mongoDB可以打乱文档写入的顺序,以便优化写入操作的性能 ordered参数的默认值为true
-
db.collection.insert() 创建单一或多个文档
db.collection.insert(<document or array of documents>, { writeConcern: <document>, ordered: <boolean> } )
-
db.collection.save() 创建单一文档
db.collection.save(<document>, { writeConcern: <document> }) * db.collection.save()命令处理一个新文档的时候,它会调用db.collection.insert()命令
-
对象主键 ObjectId
-
复合主键
-
db.collection.find()读取文档
db.collection.find(<query>, <projection>) * <query>: 定义了读取操作时筛选文档的条件 * <projection>: 定义了对读取结果进行的投射
-
比较操作符
{ <field>: { $<operator>: <value> } } * $eq 匹配字段值相等的文档 * $ne 匹配字段值不等的字段 * $gt 匹配字段值大于查询值的文档 * $gte 匹配字段值大于或等于查询值的文档 * $lt 匹配字段值小于查询值的文档 * $lte 匹配字段值小于或等于查询值的文档 * $in 匹配字段值与任一查询值相等的文档 * $nin 匹配字段值与任一查询值都不相等的文档
-
逻辑操作符
- $not 匹配筛选条件不成立的文档
{ field: { $not: { <operator-expression>} } }
- $and 匹配多个筛选条件全部成立的文档
{ field: { $and: [{<expression1>}, {<expression2>},... ] } }
- $or 匹配至少一个筛选条件成立的文档
{ field: { $or: [{<expression1>}, {<expression2>},... ] } }
- $nor 匹配多个筛选条件全部不成立的文档
{ field: { $nor: [{<expression1>}, {<expression2>},... ] } }
- $not 匹配筛选条件不成立的文档
-
字段操作符
-
数组操作符
-
$all 匹配数组字段中包含所有查询值的文档
{ field: { $all: [<value1>, <value2>, ...] }}
-
$elemMatch 匹配数组字段中至少存在一个值满足筛选条件的文档
{ field: { $elemMatch: [<query1>, <query2>, ...] }}
-
-
运算操作符
-
$regex 匹配满足正则表达式的文档
{ field: { : /pattern/, : '<options>'}} { field: { : /pattern/<options> }} * 兼容PCRE v8.41正则表达式库 * 在和$in操作符一起使用时,只能使用/pattern/<options>
-
-
文档游标函数 db.collection.find()返回一个文档集合游标,在不迭代游标的情况下,只列出前 20 个文档。可以使用游标下标直接访问文档集合中的某一个文档。游历完游标中的所有文档之后,或者在 10 分钟之后,游标便会自动关闭,可以使用 noCursorTimeout()函数来保持游标一直有效。
-
cursor.hasNext()
-
cursor.next()
-
cursor.forEach()
-
cursor.limit()
-
cursor.skip()
-
cursor.count()
cursor.count(applySkipLimit) * 默认情况下,applySkipLimit为false,即cursor.count()不会考虑cursor.limit()和cursor.skip()的效果
-
cursor.sort()
cursor.sort({ field: ordering }) * ordering: 1表示由小及大的正向排序,-1表示逆向排序
cursor.skip()在 cursor.limit()之前执行;cursor.sort()在 cursor.skip()和 cursor.limit()之前执行
-
-
文档投影操作
db.collection.find(query, projection) * 不使用投影时,db.collection.find()返回符合筛选条件的完整文档 * 使用投影可以有选择的返回文档中的部分字段 * { field: inclusion } 1表示返回字段/0表示不返回字段
除了文档主键之外,我们不可以在投影文档中混合使用包含和不包含这两种投影操作。要么列出所有应该包含的,要么列出所有不应该包含的字段
-
$set(更新或新增字段)
{ $set: { <field1>: <value1>}} * 如果向现有数组字段范围以外的位置添加新值,数组字段的长度会扩大,未被赋值的数组成员将被设置为null
-
$unset(删除字段)
{ $unset: { <field1>: '', ... }} * $unset命令中的赋值('')对操作结果没有任何影响 * 如果$unset命令中的字段根本不存在,那么文档内容将保持不变 * 当使用$unset命令删除数组字段中的某一个元素时,这个元素不会被删除,只会被赋以null值,而数组的长度不会改变
-
$rename(重命名字段)
{ $rename: { <field1>: <newName1>, ... }} * 如果$rename命令要重命名的字段并不存在,那么文档内容不会被改变 * 如果新的字段名已经存在,那么原有的这个字段会被覆盖 * 当$rename命令中的新字段存在的时候,$rename命令会先$unset新旧字段,然后再$set新字段 * $rename命令中的旧字段和新字段都不可以指向数组元素
-
$inc
-
$mul
- $inc 和$mul 只能应用于数字字段
- 如果被更新的字段不存在,$inc 会创建字段,并且将字段值设为命令中的增减值。而$mul 会创建字段,但是把字段值设为 0
-
$min
-
$max
- 比较之后更新值
- 如果被更新的字段类型和更新值类型不一致,$min 和$max 按照 BSON 数据类型排序规则进行比较
- Null
- Numbers(ints, longs, doubles, decimals)
- Symbol, String
- Object
- Array
- BinData
- ObjectId
- Boolean
- Date
- TimeStamp
- Regular Expression
-
$addToSet(向数组中增添元素)
- 如果要插入的值已经存在在数组字段中,则$addToSet 不会再添加重复值
-
使用$addToSet 插入数组和文档时,插入值中的字段顺序和已有值重复时,才被算作重复值被忽略
-
$addToSet会将数组插入被更新的数组字段中,成为内嵌数组。如果想要将多个元素直接添加到数组字段中,则需要使用$each 操作符
-
$pop(从数组中移除元素)
- $pop 操作符只能应用在数组字段上
- 删除掉数组中最后一个元素后,会留下空数组
-
$pull(从数组中有选择性的移除元素)
- $pull 命令会删去包含指定的文档字段和字段值的文档元素,字段排列顺序不需要完全匹配
-
$pullAll(从数组中有选择性的移除元素)
- $push(向数组中增添元素)
- 使用$position 操作符将元素插入到数组的指定位置
- 使用$sort 对数组进行排序
- 利用$slice 来截取部分数组
- 操作执行顺序:$position > $sort > $slice
- db.collection.update(query, update, options)
更新文档选项: { multi: <boolean> } 更新多个文档 { upsert: <boolean> } 更新或者创建文档
-
db.collection.remove() (删除文档)
- 在默认情况下,remove 命令会删除所有符合条件的文档
- 使用 justOne 选项可以只删除满足条件的第一篇文档
-
db.collection.drop() (删除集合)
- drop 命令可以删除整个集合,包括集合中的所有文档,以及集合的索引