Appearance
了解简单的 MongoDB 使用上的简单指令,具体更多复杂的用法还是需要去官网去看
数据库命令
在 MongoDB 中,数据库包含一个或多个文档集合。
- 查看所有数据库
shell
show dbs
- 显示当前所在数据库
shell
db
- 切换到指定数据库,如果切换时候不存在和创建数据库(创建和切换)双重指令,刚创建的 db 如果里面是没内容的 使用show dbs 是查看不到的
shell
use <DATABASE_NAME>
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin:这个数据库主要用于管理MongoDB数据库系统的操作。例如,创建用户和角色,授权用户权限等等。
config: 这个数据库主要用于存储MongoDB分片集群的配置信息,包括分片信息和副本集信息。
local:这个数据库主要用于在单个MongoDB服务器上存储与该服务器相关的一些信息。例如,存储单个实例的副本集状态、存储分片数据的标记和最近执行的操作日志等信息。这个数据库只在当前服务器上可见。
MongoDB默认安装时没有设置任何用户和密码,因此任何人都可以连接到MongoDB服务器,然后以读/写所有数据库的方式进行操作,因此可以说它是无权限限制的。这显然不是一个安全的实践,因此在生产环境中应该对MongoDB服务进行适当的配置和安全设置。一种推荐的实践是将访问控制和身份验证设置为MongoDB服务器的一部分,以确保只有经过身份验证的用户才能访问MongoDB服务。可以使用MongoDB提供的访问控制工具来实现此目的。这些工具包括:创建用户和角色、分配权限、控制哪些主机或网络可以连接到MongoDB服务器等。
admin数据库主要用于管理MongoDB数据库系统的操作,包括创建用户和角色、授权用户权限、监控数据库运行状态等。以下是一些admin数据库的操作:
- 创建用户和角色 可以使用以下命令在admin数据库中创建用户和角色:
use admin
db.createUser({
user: "username",
pwd: "password",
roles: [ "userAdminAnyDatabase", "readWriteAnyDatabase", "dbAdminAnyDatabase" ]
})
- 授权用户权限 可以使用以下命令在admin数据库中授权用户权限:
use admin
db.grantRolesToUser("username", [ "readAnyDatabase" ])
- 监控数据库运行状态 可以使用以下命令在admin数据库中监控数据库运行状态:
use admin
db.runCommand({ serverStatus: 1 })
以上仅是admin数据库的一些常用操作,更多操作可以查看MongoDB的官方文档。
集合命令
集合类似于关系数据库中的表,MongoDB 将文档存储在集合中。
集合名称应以下划线或字母字符开头, 不能包含 $ ,不能为空字符串 ,不能包含空字符 ,不能以 . 开头 ,长度限制(版本 4.2 最大 120 个字节,版本 4.4 最大 255 个字节)
- 创建完数据库,就要对数据库的集合进行创建
shell
db.createCollection('集合名称')
- 显示当前数据库中的所有集合
shell
show collections
- 删除集合
shell
db.集合名.drop()
- 重命名集合
shell
db.集合名.renameCollection('newName')
- 对集合做配置项 可以使用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 开始,服务器允许存储包含点 . 和美元符号 $ 的字段名称
如果该集合当前不存在,则插入操作将创建该集合。
- 插入文档
shell
db.集合名.insert(文档对象);
- 查询文档
shell
db.集合名.find(查询条件)
- 更新文档
shell
db.集合名.update(查询条件,新的文档)
db.集合名.update({name:'张三'},{$set:{age:19}})
- 删除文档
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" } }
)
- 文档字段也有自己的数据类型常见数据类型
类型 | 整数标识符 | 别名(字符串标识符) |
---|---|---|
Double | 1 | “double” |
String | 2 | “string” |
Object | 3 | “object” |
Array | 4 | “array” |
Binary data | 5 | “binData” |
ObjectId | 7 | “objectId” |
Boolean | 8 | “bool” |
Date | 9 | “date” |
Null | 10 | “null” |
Regular Expression | 11 | “regex” |
32-bit integer | 16 | “int” |
Timestamp | 17 | “timestamp” |
64-bit integer | 18 | “long” |
Decimal128 | 19 | “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 } )