Mongodb篇(中)(2)

一、说明

本篇文章的主要内容为Mongodb的各种指令;

此前我已经发布了Mongodb的安装、介绍、一些相关概念、还有少部分Mongodb指令,链接放在这里:

http://t.csdnimg.cn/lrHQNicon-default.png?t=N7T8http://t.csdnimg.cn/lrHQN

http://t.csdnimg.cn/rRRu0icon-default.png?t=N7T8http://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的一些关键特点和解析:

  1. 二进制格式:与JSON以文本字符串形式存储不同,BSON是以二进制形式存储数据,这使得它更节省空间且读写效率更高。特别是对于数字、日期、二进制数据(如图片、文件)等类型,BSON可以直接以二进制形式存储,无需像JSON那样转换为字符串。

  2. 支持更丰富的数据类型:除了基本的JSON类型(如字符串、数字、布尔值、数组、对象),BSON还支持更多的数据类型,如Date(日期时间)、ObjectId(唯一ID)、BinData(二进制数据)、Code(可执行的JavaScript代码)、Regex(正则表达式)等,这使得它能更好地满足复杂数据结构的存储需求。

  3. 文档大小限制较小:虽然MongoDB官方文档指出单个文档的最大大小为16MB,但实际上这个限制远大于普通JSON在处理复杂或嵌套数据时可能遇到的限制,使得BSON能够存储更复杂的数据结构。

  4. 效率和性能:由于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:可选参数对象,如 upsertarrayFilters 等。
db.myCollection.updateOne(
    { name: "七月" },                // 过滤条件
    { $set: { age: 24 } },            // 更新操作
    { upsert: false }                 // 可选参数
);
4.2 db.collection.updateMany(filter, update, options)

 updateMany() 方法用于更新所有匹配过滤器的文档。

  • filter:用于查找文档的查询条件。
  • update:指定更新操作的文档或更新操作符。
  • options:可选参数对象,如 upsertarrayFilters 等。
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:可选参数对象,如 projectionsortupsertreturnDocument 等。
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 条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值