一、概述
CRUD 操作新增、读取、更新和删除 文件。
新增操作
创建或插入操作将新文档添加到集合。如果集合当前不存在,则插入操作将创建集合。
在MongoDB中,插入操作以单个集合为目标。MongoDB中的所有写操作都是单个文档级别的原子操作。
读取操作
读取操作检索文件从收集;即查询集合 文件。MongoDB提供了以下方法来读取文档 一个集合:
• db.collection.find()
更新操作
更新操作修改现有文件在一个收集.
在MongoDB中,更新操作针对单个集合。全部写入 MongoDB中的操作是原子在单个文档的级别上。
您可以指定条件或筛选器,以标识要标识的文档 更新。这些过滤 器使用相同的 语法作为读取操作。
删除操作
删除操作从集合中删除文档。
在MongoDB中,删除操作针对单个收集.都 MongoDB中的写入操作是原子在单个文档的级别上。
您可以指定条件或筛选器,以标识要标识的文档 删除。这些过滤 器使用相同的 语法作为读取操作。
批量写入
MongoDB提供了批量执行写入操作的能力。
二、插入文档
1、插入单个文档
db.collection.insertOne()插入单个 公文到集合中。
下面的示例在集合中插入一个新文档。如果文档未指定 一个字段,MongoDB 将字段添加为 新文档的 ObjectId 值。看inventory_id_id插入行为。
db.inventory.insertOne( { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } })
insertOne()返回包含新插入文档的_id字段值的文档。有关返回文档的示例,请参阅db.collection.insertOne()引用。
要检索刚刚插入的文档,请查询集合:
db.inventory.find( { item: "canvas" } )
2、插入多个文档
db.collection.insertMany()可以将多个文档插入到集合中。将文档数组传递给该方法。
以下示例将三个新文档插入到库存集合中。如果文档没有指定_id字段,MongoDB会向每个文档添加带有ObjectId值的_id字段。看见
插入示例:
db.inventory.insertMany([ { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } }, { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } }, { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } } ])
三、查询文档
本页提供了使用 MongoDB Compass。本页上的示例使用inventory 集合。使用以下文档填充inventory 集合:
[ { "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" } ]
1、选择集合中的所有文档
要选择集合中的所有文档,请将空文档作为查询筛选器参数传递到查询栏。查询筛选器参数确定选择条件:
此操作使用{}的筛选器谓词,该谓词对应于以下SQL语句:
SELECT * FROM inventory
2、指定相等条件
要指定相等条件,请在<field>:<value>查询筛选器文档:
{ <field1>: <value1>, ... }
以下示例从库存集合中选择状态为“D”的所有文档:
将以下筛选器复制到指南针查询栏中,然后单击“查找”:
{ status: "D" }
此操作使用{status:“D”}的筛选器谓词,该谓词对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "D"
3、使用查询运算符指定条件
一个查询筛选器文档能 使用查询运算符以指定 以下形式的条件:
{ <field1>: { <operator1>: <value1> }, ... }
以下示例从库存集合中检索状态等于“A”或“D”的所有文档:
将以下筛选器复制到指南针查询栏中,然后单击“查找”:
{ status: { $in: [ "A", "D" ] } }
该操作使用{status:{$in:[“a”,“D”]}}}的筛选器谓词,该谓词对应于以下SQL语句:
SELECT * FROM inventory WHERE status in ("A", "D")
4、指定AND条件
复合查询可以为集合文档中的多个字段指定条件。逻辑AND连接隐含地连接复合查询的子句,以便查询选择集合中符合所有条件的文档。
以下示例检索库存集合中状态等于“A”且数量小于($lt)30的所有文档:
将以下筛选器复制到指南针查询栏中,然后单击“查找”:
{ status: "A", qty: { $lt: 30 } }
该操作使用{status:“a”,数量:{$lt:30}}的筛选器谓词,该谓词对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "A" AND qty < 30
5、指定OR条件
使用$or运算符,可以指定一个复合查询,该查询将每个子句与逻辑or连接符连接起来,以便查询选择集合中至少符合一个条件的文档。
以下示例检索集合中状态等于“A”或数量小于($lt)30的所有文档:
将以下筛选器复制到指南针查询栏中,然后单击“查找”:
{ $or: [ { status: "A" }, { qty: { $lt: 30 } } ] }
该操作使用{$或:〔{status:“a”},{qty:{$lt:30}}〕}的筛选器谓词,该谓词对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "A" OR qty < 30
6、指定AND和OR条件
在以下示例中,复合查询文档选择集合中状态等于“A”且数量小于($lt)30或项目以字符p开头的所有文档:
将以下筛选器复制到指南针查询栏中,然后单击“查找”:
{ status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] }
四、更新文档
此页面使用以下内容mongosh方法:
- db.collection.updateOne(<filter>, <update>, <options>)
- db.collection.updateMany(<filter>, <update>, <options>)
- db.collection.replaceOne(<filter>, <update>, <options>)
1、更新集合中的文档
要更新文档,MongoDB提供了更新运算符这样 如$set,以修改字段值。
若要使用更新运算符,请将 更新表格的文档:
{ <update operator>: { <field1>: <value1>, ... }, <update operator>: { <field2>: <value2>, ... }, ... }
如果字段不存在,一些更新运算符(如$set)将创建该字段。查看个人信息更新运算符详情请参考。
2、更新单个文档
以下示例使用库存集合上的db.collection.updateOne()方法更新item等于“paper”的第一个文档:
db.inventory.updateOne( { item: "paper" }, { $set: { "size.uom": "cm", status: "P" }, $currentDate: { lastModified: true } } )
更新操作:
- 使用$set运算符将size.uom字段的值更新为“cm”,将状态字段的值更改为“P”,
- 使用$currentDate运算符将lastModified字段的值更新为当前日期。如果lastModified字段不存在,则$currentDate将创建该字段。有关详细信息,请参阅$currentDate。
db.inventory.updateMany( { "qty": { $lt: 50 } }, { $set: { "size.uom": "in", status: "P" }, $currentDate: { lastModified: true } } )
更新操作:
- 使用$set运算符将size.uom字段的值更新为“in”,将状态字段的值更改为“P”,
- 使用$currentDate运算符将lastModified字段的值更新为当前日期。如果lastModified字段不存在,则$currentDate将创建该字段。有关详细信息,请参阅$currentDate。
db.inventory.replaceOne( { item: "paper" }, { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] } )
3、行为
原子性
MongoDB中的所有写操作都是单个文档级别的原子操作。
_id字段
一旦设置,就不能更新_id字段的值,也不能用具有不同_id字段值的替换文档替换现有文档。
字段顺序
对于写操作,MongoDB保留文档字段的顺序,以下情况除外:
- _id字段始终是文档中的第一个字段。
- 包含字段名称重命名的更新可能会导致文档中字段的重新排序。
五、删除文档
删除文档有两个方法:
- db.collection.deleteMany()
- db.collection.deleteOne()
1、删除所有文档
要从集合中删除所有文档,请将空的筛选器文档{}传递给db.collection.deleteMany()方法。
以下示例从库存集合中删除所有文档:
db.inventory.deleteMany({})
db.inventory.deleteMany({})
2、删除所有符合条件的文档
您可以指定用于标识要删除的文档的条件或筛选器。过滤器使用与读取操作相同的语法。
要指定相等条件,请在<field>:<value>查询筛选器文档:
{ <field1>: <value1>, ... }
查询筛选器文档可以使用查询运算符以以下形式指定条件:
{ <field1>: { <operator1>: <value1> }, ... }
若要删除符合删除条件的所有文档,请将筛选器参数传递给deleteMany()方法。
以下示例从库存集合中删除状态字段等于“A”的所有文档:
db.inventory.deleteMany({ status : "A" })
3.仅删除一个与条件匹配的文档
要最多删除一个与指定筛选器匹配的文档(即使多个文档可能与指定筛选器相匹配),请使用db.collection.deleteOne()方法。
以下示例删除状态为“D”的第一个文档:
db.inventory.deleteOne( { status: "D" } )
4、删除行为
索引
即使从集合中删除所有文档,删除操作也不会删除索引。
原子性
MongoDB中的所有写操作都是单个文档级别的原子操作。有关MongoDB和原子性的更多信息,请参阅原子性和事务。
写入确认
对于写操作,您可以指定MongoDB请求的写操作确认级别。
六、批量写入操作
1、概述
MongoDB为客户端提供批量执行写操作的能力。大容量写入操作影响单个集合。MongoDB允许应用程序确定批量写入操作所需的可接受确认级别。
db.collection.bulkWrite()方法提供了执行批量插入、更新和删除操作的能力。
MongoDB还支持通过db.collection.insertMany()方法进行批量插入。
2、有序操作与无序操作
大容量写入操作可以是有序的,也可以是无序的。
使用有序的操作列表,MongoDB可以连续执行这些操作。如果在处理其中一个写操作时发生错误,MongoDB将返回,而不处理列表中的任何剩余写操作。请参阅有序批量写入
使用无序的操作列表,MongoDB可以并行执行这些操作,但不能保证这种行为。如果在处理其中一个写操作时发生错误,MongoDB将继续处理列表中的其余写操作。请参阅无序批量写入示例。
对碎片化集合执行有序操作列表通常比执行无序列表慢,因为对于有序列表,每个操作都必须等待上一个操作完成。
默认情况下,bulkWrite()执行有序操作。要指定无序写入操作,请在选项文档中设置ordered:false。
3、bulkWrite()方法
bulkWrite()支持以下写入操作:
- insertOne
- updateOne
- updateMany
- replaceOne
- deleteOne
- deleteMany
每个写操作都作为数组中的文档传递给bulkWrite()。
下面的bulkWrite()示例在pizza集合上运行这些操作:
- 使用.insertOne添加两个文档
- 使用.updateOne更新文档
- 使用.deleteOne删除文档
- 使用.replaceOne替换文档
try { db.pizzas.bulkWrite( [ { insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } }, { insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } } }, { updateOne: { filter: { type: "cheese" }, update: { $set: { price: 8 } } } }, { deleteOne: { filter: { type: "pepperoni"} } }, { replaceOne: { filter: { type: "vegan" }, replacement: { type: "tofu", size: "small", price: 4 } } } ] ) } catch( error ) { print( error ) }
示例输出,包括已完成操作的摘要:
{ acknowledged: true, insertedCount: 2, insertedIds: { '0': 3, '1': 4 }, matchedCount: 2, modifiedCount: 2, deletedCount: 1, upsertedCount: 0, upsertedIds: {} }
官网:Doker 多克; 官方旗舰店:首页-Doker 多克 多克创新科技企业店-淘宝网全品优惠,期待您的支持!!! Doker 技术人的数码品牌!!!