目录
用户与数字平台(如网站或网络应用程序)的大多数事务性交互都包括对四种基本操作的请求:
CRUD 以数据为中心,并且根据 HTTP 动作动词进行标准化。应用程序的前端会捕获信息,并将其作为 HTTP 请求发送给中间件,中间件会调用相应的数据库函数来完成任务。这四种基本功能统称为 CRUD,即 C(创建)、R(读取)、U(更新)和 D(删除)的首字母缩写。
CRUD 方法是管理数据库中数据的主要方式。无论是批量操作还是单个操作,CRUD 操作对每个应用程序都至关重要。
创建操作的一些示例包括在数据库中创建新的用户配置文件、为用户创建购物车以及创建新的图书目录(批量插入)。
读取操作的一些示例包括:用户根据特定搜索条件获取产品详细信息,如用户搜索 “苹果” 品牌的手机;显示 iPhone 的所有型号;显示用户的产品购物车信息;以及在门户网站上查看员工详细信息。
更新操作的示例包括更新用户的个人信息、购物车信息、账单地址、时间戳或某一系列产品的序列号(批量更新)。
删除操作的一些示例包括从用户的购物车中删除产品、从收藏夹中删除图书以及删除所有超过特定时间段的记录(批量删除)。
让我们进一步探讨 CRUD 的定义,并研究如何使用 MongoDB 查询语言 (MQL) 执行 MongoDB CRUD 操作。
CRUD 操作描述了允许用户查看、搜索和修改数据库部分内容的用户界面规则。MongoDB 通过其 驱动程序 提供了一种优雅的方法,让您能够使用自己选择的编程语言来执行 CRUD 操作。
MongoDB 文档的修改方式是连接到服务器,查询适当的文档,然后更改设置属性,再将数据发回数据库进行更新。
对于单个 CRUD 操作来说:
我们已经定义了 MongoDB CRUD 操作,现在就可以看看如何执行各个操作并操作 MongoDB 数据库中的文档。让我们进入创建、读取、更新和删除文档的过程,依次查看每项操作。
顾名思义,insertOne() 允许您在集合中插入一个文档。在此示例中,我们将使用一个名为 RecordsDB 的集合。我们可以通过调用 RecordsDB 上的 insertOne() 方法,将单个条目插入到集合中。然后,我们以键值对的形式提供要插入的信息,从而建立模式。
db.RecordsDB.insertOne({
name: "Marsh",
age: "6 years",
species: "Dog",
ownerAddress: "380 W. Fir Ave",
chipped: true
})
如果创建操作成功,则会创建一个新文档。该函数将返回一个对象,其中“acknowledged”为“true”,“insertID”为新创建的“ObjectId”。
> db.RecordsDB.insertOne({
... name: "Marsh",
... age: "6 years",
... species: "Dog",
... ownerAddress: "380 W. Fir Ave",
... chipped: true
... })
{
"acknowledged" : true,
"insertedId" : ObjectId("5fd989674e6b9ceb8665c57d")
}
通过在所需集合上调用 insertMany () 方法,可以一次插入多个项目。在本例中,我们将多个项目传递到所选的集合 (RecordsDB) 中,并用逗号分隔它们。在括号内,我们使用括号来表示所传递的是一个包含多个条目的列表。这通常称为嵌套方法。
db.RecordsDB.insertMany([{
name: "Marsh",
age: "6 years",
species: "Dog",
ownerAddress: "380 W. Fir Ave",
chipped: true},
{name: "Kitana",
age: "4 years",
species: "Cat",
ownerAddress: "521 E. Cortland",
chipped: true}])
db.RecordsDB.insertMany([{ name: "Marsh", age: "6 years", species: "Dog",
ownerAddress: "380 W. Fir Ave", chipped: true}, {name: "Kitana", age: "4 years",
species: "Cat", ownerAddress: "521 E. Cortland", chipped: true}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5fd98ea9ce6e8850d88270b4"),
ObjectId("5fd98ea9ce6e8850d88270b5")
]
}
read 操作允许您提供特殊的查询筛选条件和标准,指定所需的文档。MongoDB 文档包含有关可用查询 筛选条件 的更多信息。查询修饰符还可用于更改返回结果的数量。
MongoDB 有两种方法可以从集合中读取文档:
要获取集合中的所有文档,只需在所选集合上使用 find() 方法即可。仅执行没有参数的 find() 方法将返回集合中当前的所有记录。
db.RecordsDB.find()
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "4 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
{ "_id" : ObjectId("5fd993a2ce6e8850d88270b7"), "name" : "Marsh", "age" : "6 years", "species" : "Dog", "ownerAddress" : "380 W. Fir Ave", "chipped" : true }
{ "_id" : ObjectId("5fd993f3ce6e8850d88270b8"), "name" : "Loo", "age" : "3 years", "species" : "Dog", "ownerAddress" : "380 W. Fir Ave", "chipped" : true }
{ "_id" : ObjectId("5fd994efce6e8850d88270ba"), "name" : "Kevin", "age" : "8 years", "species" : "Dog", "ownerAddress" : "900 W. Wood Way", "chipped" : true }
在结果中,我们可以看到集合中的所有记录。请注意,每条记录都分配有一个映射到“_id”键的“ObjectId”。
如果想要通过读取操作获得更具体的信息,并找到所需的记录部分,可以使用之前提到的筛选条件来确定哪些结果应该被返回。筛选结果的最常见方法之一是按值搜索。
db.RecordsDB.find({"species":"Cat"})
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "4 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
要获取满足搜索条件的文档,我们只需在所选集合上使用 findOne() 方法即可。如果多个文档满足查询条件,该方法会根据自然顺序返回第一个文档,自然顺序反映磁盘上文档的顺序。如果没有文档满足搜索条件,该函数返回空值。该函数采用以下语法形式。
db.{collection}.findOne({query}, {projection})
让我们以下面集合 RecordsDB 为例。
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "8 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
{ "_id" : ObjectId("5fd993a2ce6e8850d88270b7"), "name" : "Marsh", "age" : "6 years", "species" : "Dog", "ownerAddress" : "380 W. Fir Ave", "chipped" : true }
{ "_id" : ObjectId("5fd993f3ce6e8850d88270b8"), "name" : "Loo", "age" : "3 years", "species" : "Dog", "ownerAddress" : "380 W. Fir Ave", "chipped" : true }
{ "_id" : ObjectId("5fd994efce6e8850d88270ba"), "name" : "Kevin", "age" : "8 years", "species" : "Dog", "ownerAddress" : "900 W. Wood Way", "chipped" : true }
然后,我们运行以下代码行:
db.RecordsDB.find({"age":"8 years"})
我们会得到以下结果:
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "8 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
请注意,即使两个文档符合搜索条件,也只返回与搜索条件匹配的第一个文档。
与创建操作一样,update 操作对单个集合进行操作,它们在单个文档级别上是原子性的。更新操作使用筛选条件和标准来选择要更新的文档。
更新文档时应小心谨慎,因为更新是永久性的,无法恢复。这也适用于删除操作。
对于 MongoDB CRUD,有三种不同的文档更新方法:
我们可以更新当前存在的记录,并通过更新操作更改单个文档。为此,我们在所选集合(此处为“RecordsDB”)上使用 updateOne() 方法。为了更新文档,我们为该方法提供了两个参数:更新筛选条件和更新动作。
更新筛选条件定义我们要更新哪些项目,而更新动作则定义如何更新这些项目。我们首先输入更新筛选条件。然后,使用“$set”键并提供要更新的字段作为值。此方法将更新与提供的筛选条件匹配的第一条记录。
db.RecordsDB.updateOne({name: "Marsh"}, {$set:{ownerAddress: "451 W. Coffee St. A204"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
{ "_id" : ObjectId("5fd993a2ce6e8850d88270b7"), "name" : "Marsh", "age" : "6 years", "species" : "Dog", "ownerAddress" : "451 W. Coffee St. A204", "chipped" : true }
updateMany() 允许我们通过输入项目列表来更新多个项目,就像我们在插入多个项目时所做的那样。此更新操作使用与更新单个文档相同的语法。
db.RecordsDB.updateMany({species:"Dog"}, {$set: {age: "5"}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
> db.RecordsDB.find()
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "4 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
{ "_id" : ObjectId("5fd993a2ce6e8850d88270b7"), "name" : "Marsh", "age" : "5", "species" : "Dog", "ownerAddress" : "451 W. Coffee St. A204", "chipped" : true }
{ "_id" : ObjectId("5fd993f3ce6e8850d88270b8"), "name" : "Loo", "age" : "5", "species" : "Dog", "ownerAddress" : "380 W. Fir Ave", "chipped" : true }
{ "_id" : ObjectId("5fd994efce6e8850d88270ba"), "name" : "Kevin", "age" : "5", "species" : "Dog", "ownerAddress" : "900 W. Wood Way", "chipped" : true }
The replaceOne() 方法替换指定集合中的单个文档。replaceOne() 会替换整个文档,这意味着旧文档中未包含在新文档中的字段将丢失。
db.RecordsDB.replaceOne({name: "Kevin"}, {name: "Maki"})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.RecordsDB.find()
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "4 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
{ "_id" : ObjectId("5fd993a2ce6e8850d88270b7"), "name" : "Marsh", "age" : "5", "species" : "Dog", "ownerAddress" : "451 W. Coffee St. A204", "chipped" : true }
{ "_id" : ObjectId("5fd993f3ce6e8850d88270b8"), "name" : "Loo", "age" : "5", "species" : "Dog", "ownerAddress" : "380 W. Fir Ave", "chipped" : true }
{ "_id" : ObjectId("5fd994efce6e8850d88270ba"), "name" : "Maki" }
Delete 操作对单个集合进行操作,例如更新和创建操作。对于单个文档,删除操作也是原子性的。您可以设定筛选条件和标准来指定删除操作,明确指出要从集合中移除哪些文档。筛选条件选项依赖于读取操作所使用的相同语法。
MongoDB 有两种不同的方法可以从集合中删除记录:
deleteOne() 从 MongoDB Server 上的指定集合中删除文档。筛选条件用于指定要删除的项目。它会删除与提供的筛选条件匹配的第一条记录。
db.RecordsDB.deleteOne({name:"Maki"})
{ "acknowledged" : true, "deletedCount" : 1 }
> db.RecordsDB.find()
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "4 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
{ "_id" : ObjectId("5fd993a2ce6e8850d88270b7"), "name" : "Marsh", "age" : "5", "species" : "Dog", "ownerAddress" : "451 W. Coffee St. A204", "chipped" : true }
{ "_id" : ObjectId("5fd993f3ce6e8850d88270b8"), "name" : "Loo", "age" : "5", "species" : "Dog", "ownerAddress" : "380 W. Fir Ave", "chipped" : true }
deleteMany() 是一种用于通过单个删除操作从所需集合中删除多个文档的方法。该方法接收列表作为输入,每个项目都是根据 deleteOne() 中的筛选条件来确定的。
db.RecordsDB.deleteMany({species:"Dog"})
{ "acknowledged" : true, "deletedCount" : 2 }
> db.RecordsDB.find()
{ "_id" : ObjectId("5fd98ea9ce6e8850d88270b5"), "name" : "Kitana", "age" : "4 years", "species" : "Cat", "ownerAddress" : "521 E. Cortland", "chipped" : true }
NoSQL 数据库针对创建和读取操作进行了更好的优化,并提供了更高的可扩展性。因此,它们非常适合更高的负载(处理更多的 CRUD 操作)。它们在存储信息方面也很灵活。
在 ResearchGate 对不同类型的 NoSQL 和 SQL 数据库进行的详尽 CRUD 操作实验中,得出的结论是,NoSQL 数据库在所有 CRUD 操作中的性能都明显优于 SQL 数据库,尤其是在处理大量操作时。例如,MongoDB 在获取数据(读取操作)方面表现出色,100,000 次读取(查找/选择)操作的平均执行时间为 43.5 毫秒。MongoDB在提供原子更新(即字段级别的更新)方面具有优势,这在其他任何文档型数据库中通常都比较耗时。
本文介绍了有关 CRUD 的基本信息,并举例说明了如何在 MongoDB 中进行 CRUD 操作。MongoDB Atlas 提供一种使用 UI 执行 CRUD 操作的简单方法。您可以查看MongoDB手册,了解更多核心 MongoDB CRUD 概念,以开发高性能、可扩展的的应用程序。
CRUD 代表每个应用应能执行的四种基本操作,即创建、读取、更新和删除。这意味着应用程序应能根据需要向数据库中插入数据、从数据库中读取数据、更新数据库详细信息以及从数据库中删除数据。
CRUD 应用依赖 CRUD 操作来进行所有事务和操作。它有一个用户界面(前端)、一个控制器或 API,以及一个处理 CRUD 操作的数据库。
CRUD 操作是每个应用程序与 Web 用户交换数据所需执行的基本功能 - 例如创建新的用户配置文件 (CREATE)、从数据库获取产品详细信息 (READ)、更新员工门户网站上的员工信息 (UPDATE) 以及从目录中删除特定产品 (DELETE)。