一、说明
本篇文章的主要内容为Mongodb的各种指令;
此前我已经发布了Mongodb的安装、介绍、一些相关概念、还有少部分Mongodb指令,链接放在这里:
http://t.csdnimg.cn/lrHQNhttp://t.csdnimg.cn/lrHQN
http://t.csdnimg.cn/rRRu0http://t.csdnimg.cn/rRRu0接下来就让我们继续学习其它指令吧。
二、Mongodb命令(续上篇)
1、集合的创建
1.1 直接创建
使用 createCollection() 方法来创建集合
db.createCollection(name, options)
- name: 要创建的集合名称。
- options: 可选参数, 指定有关内存大小及索引的选项。
options 可以是如下参数:
参数名 | 类型 | 描述 | 示例值 |
---|---|---|---|
capped | 布尔值 | 是否创建一个固定大小的集合。 | true |
size | 数值 | 集合的最大大小(以字节为单位)。仅在 capped 为 true 时有效。 | 10485760 (10MB) |
max | 数值 | 集合中允许的最大文档数。仅在 capped 为 true 时有效。 | 5000 |
validator | 对象 | 用于文档验证的表达式。 | { $jsonSchema: { ... }} |
validationLevel | 字符串 | 指定文档验证的严格程度。<br>"off" :不进行验证。<br>"strict" :插入和更新操作都必须通过验证(默认)。<br>"moderate" :仅现有文档更新时必须通过验证,插入新文档时不需要。 | "strict" |
validationAction | 字符串 | 指定文档验证失败时的操作。<br>"error" :阻止插入或更新(默认)。<br>"warn" :允许插入或更新,但会发出警告。 | "error" |
storageEngine | 对象 | 为集合指定存储引擎配置。 | { wiredTiger: { ... }} |
collation | 对象 | 指定集合的默认排序规则。 | { locale: "en", strength: 2 } |
注意:在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
使用这些选项创建一个集合的实例:
db.createCollection("myComplexCollection", {
capped: true,
size: 10485760,
max: 5000,
validator: { $jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: {
bsonType: "string",
description: "必须为字符串且为必填项"
},
email: {
bsonType: "string",
pattern: "^.+@.+$",
description: "必须为有效的电子邮件地址"
}
}
}},
validationLevel: "strict",
validationAction: "error",
storageEngine: {
wiredTiger: { configString: "block_compressor=zstd" }
},
collation: { locale: "en", strength: 2 }
});
这个例子创建了一个集合,具有以下特性:
- 固定大小,最大 10MB,最多存储 5000 个文档。
- 文档必须包含
name
和email
字段,其中name
必须是字符串,email
必须是有效的电子邮件格式。 - 验证级别为严格,验证失败将阻止插入或更新。
- 使用 WiredTiger 存储引擎,指定块压缩器为 zstd。
- 默认使用英语排序规则。
再举个简单例子:
创建了一个固定大小的集合,最大大小为 5MB(5242880 字节),最多存储 5000 个文档。
db.createCollection("zzs", { capped: true, size: 5242880, max: 5000 });
1.2 通过插入文档创建
在 MongoDB 中,你不需要创建集合,当你插入一些文档时,MongoDB 会自动创建集合。
> db.zizaishui.insert({"name" : "自在水"})
> show collections
zzaishui
...
2、更新集合名
2.1 更新在同一个数据库
在 MongoDB 中,不能直接通过命令来重命名集合;
MongoDB 可以使用 renameCollection 方法来来重命名集合;
renameCollection 方法在 MongoDB 的 admin 数据库中运行,可以将一个集合重命名为另一个名称。
renameCollection 命令的语法:
db.adminCommand({ renameCollection: "sourceDb.sourceCollection", to: "targetDb.targetCollection", dropTarget: <boolean> })
参数说明:
- renameCollection:要重命名的集合的完全限定名称(包括数据库名)。
- to:目标集合的完全限定名称(包括数据库名)。
- dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合。默认值为
false
。
例子:
1. 连接数据库
use zizaishui
2. 运行 renameCollection 命令
db.adminCommand({
renameCollection: "zizaishui.oldCollection",
to: "zizaishui.newCollection"
});
2.2 更新在另一个数据库
还可以将集合重命名到另一个数据库,例如将 zizaishuione 数据库中的 oldCollection 重命名为 zizaishuitwo 数据库中的 newCollection,可以这样做:
db.adminCommand({
renameCollection: "zizaishuione.oldCollection",
to: "zizaishuitwo.newCollection"
});
2.3 注意
目标集合不能已经存在。如果目标集合存在,则会返回错误。
重命名集合会保留所有文档和索引。
3、插入文档
文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
3.1 BSON和JSON
BSON(Binary JSON)是一种用于MongoDB等数据库的文件存储格式,它设计的目的是为了弥补JSON在某些应用场景下的不足,尤其是对于大型文档存储和低层次的计算机处理效率方面。下面是BSON相对于普通JSON的一些关键特点和解析:
-
二进制格式:与JSON以文本字符串形式存储不同,BSON是以二进制形式存储数据,这使得它更节省空间且读写效率更高。特别是对于数字、日期、二进制数据(如图片、文件)等类型,BSON可以直接以二进制形式存储,无需像JSON那样转换为字符串。
-
支持更丰富的数据类型:除了基本的JSON类型(如字符串、数字、布尔值、数组、对象),BSON还支持更多的数据类型,如Date(日期时间)、ObjectId(唯一ID)、BinData(二进制数据)、Code(可执行的JavaScript代码)、Regex(正则表达式)等,这使得它能更好地满足复杂数据结构的存储需求。
-
文档大小限制较小:虽然MongoDB官方文档指出单个文档的最大大小为16MB,但实际上这个限制远大于普通JSON在处理复杂或嵌套数据时可能遇到的限制,使得BSON能够存储更复杂的数据结构。
-
效率和性能:由于BSON的二进制特性,它在读取和写入数据时减少了数据解析的开销,尤其是在处理大量或复杂数据时,这种效率提升更为明显。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。尽管它的名字中含有“JavaScript对象表示法”,但JSON独立于任何语言,许多编程语言都支持JSON数据格式的解析和生成。
JSON基于JavaScript的对象字面量语法,但是独立于JavaScript,可以被任何编程语言使用。其主要用途在于序列化对象,即把内存中的数据对象转换为字符串形式,以便在网络上传输或者保存到文件中。同时,也可以将已序列化的字符串还原为原始的对象结构,这一过程称为反序列化。
JSON的主要数据结构包括两种类型:
(1)对象:在JSON中,一个对象以{}
括起来,由键值对组成,键必须是字符串且用双引号包围,多个键值对之间用逗号分隔。
(2)数组:数组在JSON中用[]
括起来,包含一系列有序的值(可以是不同类型的值),值之间用逗号分隔。
3.2插入文档方法
3.2.1 db.collection.insertOne(document, options):插入单个文档
- document:要插入的单个文档。
- options(可选):一个可选参数对象,可以包含 writeConcern 和 bypassDocumentValidation 等。
db.myCollection.insertOne({
name: "water",
age: 19,
address: "Earth"
});
3.2.2 db.collection.insertMany(documents, options):插入多个文档
- documents:要插入的文档数组。
- options(可选):一个可选参数对象,可以包含 ordered、writeConcern 和 bypassDocumentValidation 等。
db.myCollection.insertMany([ { name: "张三", age: 22, city: "成都" }, { name: "李四", age: 35, city: "天津" }, { name: "王五", age: 18, city: "郑州" } ]);
3.2.3 db.collection.save(document, options):
类似于 insertOne()。如果文档存在,则该文档会被更新;如果文档不存在,则会插入一个新文档。
db.myCollection.save({
_id: ObjectId("60c72b2f9b1d8b5a5f8e2b2d"),
name: "更生",
age: 23,
city: "郑州"
});
3.2.4 options 参数通常可以包含以下选项:
- ordered(仅适用于 insertMany):布尔值。如果为 true,则按顺序插入文档,在遇到错误时停止;如果为 false,则尝试插入所有文档,即使遇到错误也继续。默认值为 true。
- writeConcern:指定写操作的确认级别。
- bypassDocumentValidation:布尔值。如果为 true,则忽略集合的文档验证规则。
4、更新文档
在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括 updateOne()、updateMany()、replaceOne() 和 findOneAndUpdate()。
4.1 db.collection.updateOne(filter, update, options)
updateOne() 方法用于更新匹配过滤器的单个文档。
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如
upsert
、arrayFilters
等。
db.myCollection.updateOne(
{ name: "七月" }, // 过滤条件
{ $set: { age: 24 } }, // 更新操作
{ upsert: false } // 可选参数
);
4.2 db.collection.updateMany(filter, update, options)
updateMany() 方法用于更新所有匹配过滤器的文档。
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如
upsert
、arrayFilters
等。
db.myCollection.updateMany(
{ age: { $lt: 23 } }, // 过滤条件
{ $set: { status: "active" } }, // 更新操作
{ upsert: false } // 可选参数
);
4.3 db.collection.replaceOne(filter, replacement, options)
replaceOne() 方法用于替换匹配过滤器的单个文档,新的文档将完全替换旧的文档。
- filter:用于查找文档的查询条件。
- replacement:新的文档,将替换旧的文档。
- options:可选参数对象,如
upsert
等。db.myCollection.replaceOne( { name: "张三" }, // 过滤条件 { name: "张三", age: 31 } // 新文档 );
4.4 db.collection.findOneAndUpdate(filter, update, options)
findOneAndUpdate() 方法用于查找并更新单个文档,可以选择返回更新前或更新后的文档。
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如
projection
、sort
、upsert
、returnDocument
等。
db.myCollection.findOneAndUpdate(
{ name: "Charlie" }, // 过滤条件
{ $set: { age: 36 } }, // 更新操作
{ returnDocument: "after" } // 可选参数,返回更新后的文档
);
4.5 这些更新方法的 options 参数通常可以包含以下选项:
- upsert:如果没有匹配的文档,是否插入一个新文档。
- arrayFilters:当更新嵌套数组时,指定应更新的数组元素的条件。
- collation:指定比较字符串时使用的排序规则。
- returnDocument:在 findOneAndUpdate 中使用,指定返回更新前 ("before") 或更新后 ("after") 的文档。
5、删除文档
常用的删除文档方法包括 deleteOne()、deleteMany() 以及 findOneAndDelete()。
使用场景:
- 数据清理:删除不再需要的旧数据或无效数据。
- 数据修正:在数据修正过程中删除错误的或重复的文档。
- 自动化任务:在自动化脚本或任务中,根据特定条件删除文档。
5.1 db.collection.deleteOne(filter, options)
deleteOne() 方法用于删除匹配过滤器的单个文档。
- filter:用于查找要删除的文档的查询条件。
- options(可选):一个可选参数对象。
db.myCollection.deleteOne({ name: "张三" });
5.2 db.collection.deleteMany(filter, options)
deleteMany() 方法用于删除所有匹配过滤器的文档。
db.myCollection.deleteMany({ score: "差" });
5.3 db.collection.findOneAndDelete(filter, options)
findOneAndDelete() 方法用于查找并删除单个文档,并可以选择返回删除的文档。
db.myCollection.findOneAndDelete(
{ name: "zzzz" },
{ projection: { name: 1, age: 1 } }
);
findOneAndDelete 返回被删除的文档,如果找不到匹配的文档,则返回 null
5.4 这些删除方法的 options 参数通常可以包含以下选项:
- writeConcern:指定写操作的确认级别。
- collation:指定比较字符串时使用的排序规则。
- projection(仅适用于
findOneAndDelete
):指定返回的字段。 - sort(仅适用于
findOneAndDelete
):指定排序顺序以确定要删除的文档。
6、查询文档
MongoDB 查询文档使用 find()、findOne() 方法
6.1 db.collection.find(query, projection)
- query:用于查找文档的查询条件。默认为
{}
,即匹配所有文档。 - projection(可选):指定返回结果中包含或排除的字段。
查找所有文档:
db.myCollection.find();
按条件查找文档:
db.myCollection.find({ age: { $gt: 19 } });
按条件查找文档,并只返回指定字段:
db.myCollection.find(
{ age: { $gt: 19 } },
{ name: 1, age: 1, _id: 0 }
);
6.1.1 db.myCollection.find().pretty()
pretty() 方法以格式化的方式来显示所有文档
6.2 db.collection.findOne(query, projection)
findOne() 方法用于查找集合中的单个文档。如果找到多个匹配的文档,它只返回第一个。
查找单个文档:
db.myCollection.findOne({ name: "zizaishui" });
查找单个文档,并只返回指定字段:
db.myCollection.findOne(
{ name: "zizaishui" },
{ name: 1, age: 1, _id: 0 }
);
6.3 高级查询方法(暂时不写)
使用比较操作符、使用逻辑操作符、使用正则表达式、投影、排序、限制与跳过;
MongoDB AND 条件、 MongoDB OR 条件