数据库基本对象管理API
数据库管理API
- 查看所有(有数据的)数据库:
show dbs
- 查看当前使用的数据库:
db
- 切换或者创建数据库:
use DATABASE
- 删除当前使用的数据库:
db.dropDatabase()
集合管理API
- 创建集合:
db.createCollection(COLLECTION, OPTIONS?)
- 查看已经创建的集合:
show collections
orshow tables
- 删除集合:
db.COLLECTION.drop()
文档管理API
- 插入文档:根据主键是否存在自动进行插入或者更新
db.COL.save(DOC)
: 主键重复是更新,否则新建db.COL.insert(DOC)
: 主键重复时报错,否则新建db.COL.insertOne(DOC)
db.COL.insertMany(DOC_LIST)
- 只有指定
_id
属性时才有主键重复这一说
- 更新文档
db.COL.update()
: 根据查询条件筛选并更新文档sb.COL.save()
: 传入文档替换原文档,也可以新建文档
- 删除文档
db.COL.remove()
: 根据查询条件移除文档(outdated)db.COL.deleteOne()
db.COL.deleteMany()
- 查询文档
db.COL.find()
文档管理操作例子
插入文档
看两个东西:用什么 API 插的,插入的文档有没有指定主键。
insert
用来新建文档
- 指定主键并且主键重复时,报错
- 主键未指定或者指定的主键不重复时,新建文档
> db.col.drop()
> user = {"_id": "SZ001", "name": "barwe"}
{ "_id" : "SZ001", "name" : "barwe" }
> db.col.insert(user)
WriteResult({ "nInserted" : 1 })
> db.col.find()
{ "_id" : "SZ001", "name" : "barwe" }
> db.col.insert(user)
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: gmp.col index: _id_ dup key: { _id: \"SZ001\" }"
}
})
save
新建或者更新文档:
- 未指定主键或者主键不重复时,新建一个文档
- 指定主键并且主键重复时,更新一个文档
> db.col.drop()
> db.col.save({"_id": "SZ001", "name": "barwe"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "SZ001" })
> db.col.find()
{ "_id" : "SZ001", "name" : "barwe" }
> db.col.save({"_id": "SZ002", "name": "zhangsan"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "SZ002" })
> db.col.find()
{ "_id" : "SZ001", "name" : "barwe" }
{ "_id" : "SZ002", "name" : "zhangsan" }
> db.col.save({"_id": "SZ002", "name": "wangwu"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : "SZ001", "name" : "barwe" }
{ "_id" : "SZ002", "name" : "wangwu" }
insertOne
与 insert
类似。
insertMany
insertOne
的批量版本。
只要有一个插入失败,整个文档列表都将插入失败。
> db.col.drop()
> db.col.insert({"_id": "SZ001", "name": "SZ001"})
> db.col.insertMany([
{"_id": "SZ001", "name": "SZ000-2"},
{"_id": "SZ002", "name": "SZ0002"}
])
更新文档
save
指定主键且主键重复时,用新文档去替换旧文档。
update
这个才是更新文档的优雅姿势。
db.COLLECTION.update(QUERY, UPDATE, {
upsert?: BOOLEAN,
multi?: BOOLEAN,
writeConcern?: ...
})
- QUERY: 文档查询条件
- UPDATE: 定义更新目标文档的操作
- upsert: 查询结果未空时是否新建文档,默认 false
- multi: 更新找到的所有文档,默认 false
- writeConcern: 抛出异常的级别
删除文档
deleteOne
删除符合指定条件的第一个文档:
db.COL.deleteOne({name: "value"})
deleteMany
删除符合指定条件的所有文档:
db.COL.deleteMany({name: "value"})
remove (deprecated)
db.COLLECTION.remove(QUERY, {
justOne?: BOOLEAN,
writeConcern: ...
})
- QUERY: 删除符合条件的所有文档
- justOne: 是否只删除符合条件的第一个文档,默认为 false,即删除所有文档
删除集合中的所有文档:
db.COLLECTION.remove({})
查询文档
上面提到的update
, delete*
, remove
以及专门用于查询的find
都需要用到查询语句。
查询多个用find
,查询全部用find()
,查询单个用findOne
,打印查询结果可以加pretty()
美化输出。
操作 | MongoDB find 查询条件 | RDBMS WHERE 子句 |
---|---|---|
等于 | find({ name: "barwe" }) | WHERE name = 'barwe' |
小于 | find({ age: { $lt: 20 } }) | WHERE age < 20 |
小于或等于 | find({ age: { $le: 20 } }) | WHERE age <= 20 |
大于 | find({ age: { $gt: 20 } }) | WHERE age > 20 |
大于或者等于 | find({ age: { $ge: 20 } }) | WHERE age >= 20 |
不等于 | find({ name: { $ne: "barwe" } }) | WHERE name != 'barwe' |
条件与 | find({name: "barwe", age: 20}) | WHERE name='barwe' AND age=20 |
条件或 | find({$or: [{name: "barwe"}, {age: 20}]}) | WHERE name='barwe' OR age=20 |
与和或的混合 | find({X: 1, $or: [{Y: 2, Z: 3}]}) | WHERE X=1 AND (Y=2 OR Z=3) |
以什么开头 | find({phone: /^132/}) JS正则 | |
以什么结尾 | find({email: /com$/}) JS正则 |
只读取一定数量的文档:
db.COL.find().limit(10)
跳过一定数量的文档:
db.COL.find().skip(2)
对查询结果排序:
// 按姓名升序
db.COL.find().sort({ name: 1})
// 按年龄降序
db.COL.find().sort({ age: -1})
sort
, skip
, limit
同时使用的执行顺序是:sort
, skip
, limit
。
操作符
特殊的查询条件需要借助于特殊的查询操作符。
逻辑运算操作符
- 比较大小的五个操作符:大于(
$gt
)、大于等于($ge
)、小于($lt
)、小于等于($le
)、不等于($ne
) - 条件的或运算:
$or
- 按位运算:
$bitsAllClear
,$bitsAllSet
,$bitsAnyClear
,$bitsAnySet
- ……
类型查询操作符
按照字段的值的数据类型获取文档,例如 X 的字段值既有数值又有字符串,然后我们只想取出值类型为字符串的文档:
db.COL.find({X: {$type: 'string'}})
索引技术
对集合中文档的字段排序建立索引加快查询。
db.COL.createIndex(INDEX_OBJ, OPTIONS?)
db.COL.createIndex({name: 1}) // 升序建立索引
db.COL.createIndex({age: -1}) // 降序建立索引
可以对多个字段建立复合索引:
db.COL.createIndex({name: 1, age: -1})
createIndex
的选项:
background: false
在后台创建索引,不会阻塞其他数据库操作unique: false
建立的索引是否唯一name
索引字段名,默认为索引字段名和排序顺序拼接而成sparse: false
建立索引时忽略不包含索引字段的文档- ……
聚合技术
聚合用来处理数据统计,例如求均值、求和、计数等。
参考 https://www.runoob.com/mongodb/mongodb-aggregate.html.
分布式技术
数据备份
将数据自动备份到多个服务器上。
参考 https://www.runoob.com/mongodb/mongodb-replication.html。
分片技术
将数据分割到不同的服务器上,提高吞吐量。
参考 https://www.runoob.com/mongodb/mongodb-replication.html。
数据的导入导出
导出用mongodump
,导入用mongorestore
。
评论区