1 db数据库

(1) 显示所有数据库

  1. show dbs

(2) 切换/创建数据库

如果数据库不存在则创建数据库

  1. use <database>

(3) 查看当前数据库状态

  1. > db.stats()
  2. {
  3. "db" : "mofang",
  4. "collections" : 0,
  5. "views" : 0,
  6. "objects" : 0,
  7. "avgObjSize" : 0,
  8. "dataSize" : 0,
  9. "storageSize" : 0,
  10. "totalSize" : 0,
  11. "indexes" : 0,
  12. "indexSize" : 0,
  13. "scaleFactor" : 1,
  14. "fileSize" : 0,
  15. "fsUsedSize" : 0,
  16. "fsTotalSize" : 0,
  17. "ok" : 1
  18. }

2 Collections数据表

(1) 创建

  1. db.createCollection("tb1")
  2. // 插入时也会自动创建集合
  3. > db.tb2.insert({"name": "ws"})
  4. > show collections
  5. tb2

(2) 删除

  1. db.tb1.drop()

(3) 统计表行数

  1. db.users.count()

3 document记录

(1) 增加

3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。之前的insert()被废弃
db.collection.insertOne() 用于向集合插入一个新文档:

  1. db.users.insertOne({"name": "ws1", "age": 10, "birthday": new Date("2000-01-01")})
  2. // 有则更新, 无则插入
  3. db.users.replaceOne(
  4. {"name": "ws1", "age": 10, "birthday": new Date("2000-01-01")},
  5. {"name": "ws1", "age": 20, "birthday": new Date("2000-01-01")}
  6. )

db.collection.insertMany() 用于向集合插入一个多个文档:

  1. db.users.insertMany([
  2. {"name": "ws2", "age": 19, "birthday": new Date("2001-02-01")},
  3. {"name": "ws3", "age": 18, "birthday": new Date("2002-03-01")}
  4. ])

(2) 查询

1) find()条件筛选

find() 方法以非结构化的方式来显示所有文档。

  1. db.collection.find({key: value})
  • 范围查找

    1. db.users.find({"age":{$gt:20, $lte:23}})
  • 日期查找(相等的查不出来)

    1. db.users.find({"birthday": {$gt: new Date("2001-01-01")}})
  • 与或非 ```shell // AND db.users.find({ “birthday”: {

    1. $gt: new Date("2001-01-01"),
    2. $lt: new Date("2003-02-01")

    },

    1. "name": "ws3"

    })

// OR db.users.find({ $or: [{ “age”: 20 }, { “name”: “ws3” }] })

// NOT db.users.find({ “age”: {$not: {$eq: 20}} })

  1. - 字符串包含
  2. ```shell
  3. db.users.find({
  4. "name": /^ws.*$/
  5. })

2) sort()排序

  1. db.users.find().sort({"name": -1}) // -1代表降序

3) limit(), skip()分页

  1. db.users.find().limit(5).skip(1*5) // skip()方法来跳过指定数量的数据

4) aggregate()分组聚合

  1. // 求和, _id 指定为 null 就是不分组, 直接对全部数据进行求和
  2. db.users.aggregate(
  3. [
  4. {
  5. $group: {
  6. _id: null,
  7. totalAge: {$sum: '$age'}
  8. }
  9. }
  10. ]
  11. );
  12. // 分组求和
  13. db.users.aggregate(
  14. [
  15. {
  16. $group: {
  17. _id: '$gender',
  18. totalAge: {$sum: '$age'}
  19. }
  20. }
  21. ]
  22. );
  23. // 平均值
  24. db.orders.aggregate(
  25. [
  26. {
  27. $group: {
  28. _id: null,
  29. avgAmount: {
  30. $avg: {
  31. $sum:['$amount', '$express_fee']
  32. }
  33. }
  34. }
  35. }
  36. ]
  37. );

(3) 更新

update() 方法用于更新已存在的文档。
注: 默认只更新找到的第一条记录

1) 添加一个字段

  1. db.users.update(
  2. {
  3. "name": "ws1"
  4. },
  5. {
  6. $set: {
  7. "delete_at": new Date("2022-01-20")
  8. }
  9. }
  10. )

db.collection.update( , // 类似sql update查询内where后面的 , // 可以理解为sql update查询内set后面的 upsert: false, // 如果不存在update的记录,是否插入objNew, true为插入 multi: false, // 默认是false,只更新找到的第一条记录,否则查出来的多条记录全部更新 writeConcern: // 抛出异常的级别 )

2) 删除一个字段

  1. db.users.update(
  2. {},
  3. {
  4. $unset: {
  5. money: ''
  6. }
  7. },
  8. false,
  9. true
  10. )

(4) 删除

  1. db.users.deleteOne({"name": "ws1"})

其它操作

(1) 启动与关闭Mongodb

mongodb配置文件: /etc/mongodb.conf

  • 重新加载配置,并启动mongodb

    systemctl daemon-reload systemctl start mongod

  • 查看运行状态

    systemctl status mongod

  • 如果mongodb状态为stop,则运行

    systemctl enable mongod

  • 停止mongodb

    systemctl stop mongod

  • 重启mongodb

    systemctl restart mongod

(2) 进入, 退出, 创建管理员

MongoDB安装完成后,默认是没有权限验证的,默认是不需要输入用户名密码即可登录的
也可以启动权限认证,但是必须注意:
mongodb默认是没有管理员账号的,所以要先切换到admin数据库添加管理员账号,再开启权限认证

  • 进入交互终端

    mongo

  • 退出交互终端

    exit

  • 创建管理员

    1. # 进入/切换数据库到admin中
    2. use admin
    3. # 创建账户管理员
    4. db.createUser({
    5. user: "admin",
    6. pwd: "123",
    7. roles: [
    8. {role: "userAdminAnyDatabase",db:"admin"} # 此管理员账号 只能用于管理数据库账号,不能进行数据库操作
    9. ]
    10. })
    1. # 进入/切换数据库到admin中
    2. use admin
    3. # 创建超级管理员账号
    4. db.createUser({
    5. user: "root",
    6. pwd: "123",
    7. roles: [
    8. { role: "root", db: "admin" } # 此管理员账号 可以进行数据库相关操作。
    9. ]
    10. })

(3) 用户管理

  • 创建用户自己的数据库的角色

    1. # 切换数据库,如果当前库不存在则自动创建
    2. use ws
    3. # 创建管理员用户
    4. db.createUser({
    5. user: "ws",
    6. pwd: "123",
    7. roles: [
    8. { role: "dbOwner", db: "ws"}
    9. ]
    10. })
  • 查看当前库下的用户

    1. use ws # 只需要切换到对应的库中即可查看
    2. show users
  • 查看系统中所有的用户

    1. use admin
    2. db.auth("root","123") # 需要切换到admin中使用账号管理员的权限进行操作
    3. db.system.users.find()
  • 删除用户

    1. # 有多种删除方式,下面是根据user用户名删除用户
    2. db.system.users.remove({user:"ws"})
  • 修改密码

    1. use ws # 必须切换到对应的库下 db.changeUserPassword(“账户名”, “新密码”)
    2. db.changeUserPassword("ws", "123456")
  • 关于—auth

image.png

(4) 索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

  1. // 创建索引: Key 值为你要创建的索引字段,1 为指定按升序创建索引
  2. db.collection.createIndex(keys, options)
  3. // 删除索引: 索引名
  4. db.users.getIndexes()
  5. db.users.dropIndex("name_1")

options为可选参数

Parameter Type Description
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.
  1. db.users.createIndex({"name": 1}, {"unique": true})