Skip to content
快速预览

mongoDB指令

✍️ w 🕒 2023-06-06 08:22:52(a year ago) 🔗 E.数据库 数据库 mongoDB

了解简单的 MongoDB 使用上的简单指令,具体更多复杂的用法还是需要去官网去看

数据库命令

在 MongoDB 中,数据库包含一个或多个文档集合。

  1. 查看所有数据库
shell
show dbs
  1. 显示当前所在数据库
shell
db
  1. 切换到指定数据库,如果切换时候不存在和创建数据库(创建和切换)双重指令,刚创建的 db 如果里面是没内容的 使用show dbs 是查看不到的
shell
use <DATABASE_NAME>

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

admin:这个数据库主要用于管理MongoDB数据库系统的操作。例如,创建用户和角色,授权用户权限等等。

config: 这个数据库主要用于存储MongoDB分片集群的配置信息,包括分片信息和副本集信息。

local:这个数据库主要用于在单个MongoDB服务器上存储与该服务器相关的一些信息。例如,存储单个实例的副本集状态、存储分片数据的标记和最近执行的操作日志等信息。这个数据库只在当前服务器上可见。

MongoDB默认安装时没有设置任何用户和密码,因此任何人都可以连接到MongoDB服务器,然后以读/写所有数据库的方式进行操作,因此可以说它是无权限限制的。这显然不是一个安全的实践,因此在生产环境中应该对MongoDB服务进行适当的配置和安全设置。一种推荐的实践是将访问控制和身份验证设置为MongoDB服务器的一部分,以确保只有经过身份验证的用户才能访问MongoDB服务。可以使用MongoDB提供的访问控制工具来实现此目的。这些工具包括:创建用户和角色、分配权限、控制哪些主机或网络可以连接到MongoDB服务器等。

admin数据库主要用于管理MongoDB数据库系统的操作,包括创建用户和角色、授权用户权限、监控数据库运行状态等。以下是一些admin数据库的操作:

  1. 创建用户和角色 可以使用以下命令在admin数据库中创建用户和角色:
use admin
db.createUser({
   user: "username",
   pwd: "password",
   roles: [ "userAdminAnyDatabase", "readWriteAnyDatabase", "dbAdminAnyDatabase" ]
})
  1. 授权用户权限 可以使用以下命令在admin数据库中授权用户权限:
use admin
db.grantRolesToUser("username", [ "readAnyDatabase" ])
  1. 监控数据库运行状态 可以使用以下命令在admin数据库中监控数据库运行状态:
use admin
db.runCommand({ serverStatus: 1 })

以上仅是admin数据库的一些常用操作,更多操作可以查看MongoDB的官方文档。

集合命令

集合类似于关系数据库中的表,MongoDB 将文档存储在集合中。

集合名称应以下划线或字母字符开头, 不能包含 $ ,不能为空字符串 ,不能包含空字符 ,不能以 . 开头 ,长度限制(版本 4.2 最大 120 个字节,版本 4.4 最大 255 个字节)

  1. 创建完数据库,就要对数据库的集合进行创建
shell
db.createCollection('集合名称')
  1. 显示当前数据库中的所有集合
shell
show collections
  1. 删除集合
shell
db.集合名.drop()
  1. 重命名集合
shell
db.集合名.renameCollection('newName')
  1. 对集合做配置项 可以使用db.createCollection()可以指定集合的最大大小、存储引擎、文档验证规则、索引等选项,如果没有创建事实上,MongoDB在内部为每个数据库和集合维护了一个系统命名空间,用于管理数据库和集合的元数据信息以及索引和其他元素。因此,当您执行存储操作时,MongoDB会自动检查这些命名空间并相应地创建或更新相应的集合

创建一个名为“myNewCollection”的新集合,并指定集合为有限制大小的集合(capped),设置最大大小为20KB,最大文档数为1000。

shell
db.createCollection("myNewCollection", {
   capped: true,
   size: 20000,
   max: 1000
})

文档

MongoDB 将数据记录存储为 BSON 文档 ,BSON(Binary JSON)是 JSON 文档的二进制表示形式,它比 JSON 包含更多的数据类型

文档对字段名称有以下限制:字段名称 _id 保留用作主键;它的值在集合中必须是唯一的,不可变的,并且可以是数组以外的任何类型, 从 MongoDB 3.6 开始,服务器允许存储包含点 . 和美元符号 $ 的字段名称

如果该集合当前不存在,则插入操作将创建该集合。

  1. 插入文档
shell
db.集合名.insert(文档对象);
  1. 查询文档
shell
db.集合名.find(查询条件)
  1. 更新文档
shell
db.集合名.update(查询条件,新的文档)
db.集合名.update({name:'张三'},{$set:{age:19}})
  1. 删除文档
shell
db.集合名.remove(查询条件)

关于插入的补充

db.collection.insertOne() 插入单个文档到集合中

db.collection.insertMany() 插入多个文档到集合中

db.collection.insert() 将1个或多个文档插入到集合中

举了例子 给档期数据库集合为 inventory 插入一条数据

shell
db.inventory.insertOne(
   { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
  • 文档字段也有自己的数据类型常见数据类型
类型整数标识符别名(字符串标识符)
Double1“double”
String2“string”
Object3“object”
Array4“array”
Binary data5“binData”
ObjectId7“objectId”
Boolean8“bool”
Date9“date”
Null10“null”
Regular Expression11“regex”
32-bit integer16“int”
Timestamp17“timestamp”
64-bit integer18“long”
Decimal12819“decimal”

文档里的_id 字段

在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略 _id 字段,则 MongoDB 驱动程序会自动为 _id 字段生成 ObjectId。

_id 字段具有以下行为和约束:

  • 默认情况下,MongoDB 在创建集合时会在 _id 字段上创建唯一索引。
  • _id 字段始终是文档中的第一个字段
  • _id 字段可以包含任何 BSON 数据类型的值,而不是数组。

文档中的查询

文档中查询是一个复杂的组合,find 仅仅是一个最简单的使用方式,更多方式有

find 使用

  • db.collection.find(query, projection)
    • query :可选,使用查询操作符指定查询条件
    • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。在projection中,可以使用1或0来指定要返回或排除的字段,但是你也可以使用其他的值,如true或false
  • db.collection.findOne() 查找一条

创建一个集合案例后续使用这个集合进行查找

shell
db.inventory.insertMany([
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

指定返回字段

shell
db.inventory.find({},{status:1})

查询后结果

[
  { _id: ObjectId("6473056825147561110673f3"), status: 'A' },
  { _id: ObjectId("6473056825147561110673f4"), status: 'A' },
  { _id: ObjectId("6473056825147561110673f5"), status: 'D' },
  { _id: ObjectId("6473056825147561110673f6"), status: 'D' },
  { _id: ObjectId("6473056825147561110673f7"), status: 'A' }
]

指定查询内容

shell
db.inventory.find( { status: "D" } )

等价于 SQL 中的 SELECT * FROM inventory WHERE status = "D" 语句。

find 配合运算符

比较运算符:

名称描述
$eq匹配等于指定值的值。
$gt匹配大于指定值的值。
$gte匹配大于或等于指定值的值。
$in匹配数组中指定的任何值。
$lt匹配小于指定值的值。
$lte匹配小于或等于指定值的值。
$ne匹配所有不等于指定值的值。
$nin不匹配数组中指定的任何值。

逻辑运算符:

名称描述
$and将查询子句与逻辑连接,并返回与这两个子句条件匹配的所有文档。
$not反转查询表达式的效果,并返回与查询表达式不匹配的文档。
$nor用逻辑NOR连接查询子句,返回所有不能匹配这两个子句的文档。
$or用逻辑连接查询子句,或返回与任一子句条件匹配的所有文档。

查询指定 AND 条件

shell
db.inventory.find( { status: "A", qty: { $lt: 30 } } )

该操作对应于以下SQL语句:

SELECT * FROM inventory WHERE status = "A" AND qty < 30

指定 OR 条件

使用 $or 运算符,您可以指定一个复合查询,该查询将每个子句与一个逻辑或连接相连接,以便该查询选择集合中至少匹配一个条件的文档。

下面的示例检索状态为 A 或数量小于 $lt30 的集合中的所有文档

shell
db.inventory.find({
  $or: [
    { status: "A" },
    { qty: { $lt: 30 } }
  ]
})

SELECT * FROM inventory WHERE status = "A" OR qty < 30

指定 AND 和 OR 条件

在下面的示例中,复合查询文档选择状态为“ A”且qty小于($ lt)30或item以字符p开头的所有文档:

shell
db.inventory.find({
  status: "A",
  $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
})

SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")

匹配数组中指定的任何值

下面的示例从状态为“ A”或“ D”等于“库存”的清单集中检索所有文档:

shell
db.inventory.find( { status: { $in: [ "A", "D" ] } } )

SELECT * FROM inventory WHERE status in ("A", "D")

不包含字段的文档

$exists 操作符可以用来在一个查询表达式中测试某个字段是否存在。在这个查询语句中, $exists 对应的值是 false,表示查询只匹配不包含 item 字段的文档。

shell
db.inventory.find( { item : { $exists: false } } )

类型检查

该查询仅返回 item 字段值为 null 的文档。{ item: { $type: 10 } } 查询仅匹配包含 item 字段,其值为 null 的文档;即 item 字段的值为 BSON 类型为 Null(类型编号10):

shell
db.inventory.find( { item : { $type: 10 } } )

相等过滤

{item: null} 查询将匹配包含其值为 null 的 item 字段或不包含 item 字段的文档。

shell
db.inventory.find( { item: null } )

更多操作参考

https://www.yuque.com/lipengzhou/mongodb/mspxar

Released under the MIT License.