侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

MongoDB (01) 数据库的基本使用

barwe
2022-05-22 / 0 评论 / 0 点赞 / 910 阅读 / 4,784 字
温馨提示:
本文最后更新于 2022-05-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

数据库基本对象管理API

数据库管理API

  • 查看所有(有数据的)数据库:show dbs
  • 查看当前使用的数据库:db
  • 切换或者创建数据库:use DATABASE
  • 删除当前使用的数据库:db.dropDatabase()

集合管理API

  • 创建集合:db.createCollection(COLLECTION, OPTIONS?)
  • 查看已经创建的集合:show collections or show 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

0

评论区