MongoDB 的 CRUD 操作是针对 document 的读写操作。
Create 操作
MongoDB 提供以下操作向一个 collection 插入 document
db.collection.insertOne()
(opens new window):插入一条 documentdb.collection.insertMany()
(opens new window):插入多条 document
注:以上操作都是原子操作。
插入操作的特性:
- MongoDB 中的所有写操作都是单个文档级别的原子操作。
- 如果要插入的 collection 当前不存在,则插入操作会自动创建 collection。
- 在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的
_id
(opens new window)字段作为主键。如果插入的文档省略_id
字段,则 MongoDB 驱动程序会自动为_id
字段生成 ObjectId。 - 可以 MongoDB 写入操作的确认级别来控制写入行为。
【示例】插入一条 document 示例
db.inventory.insertOne({
item: 'canvas',
qty: 100,
tags: ['cotton'],
size: { h: 28, w: 35.5, uom: 'cm' },
})
【示例】插入多条 document 示例
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' },
},
])
Read 操作
MongoDB 提供 db.collection.find()
(opens new window)方法来检索 document。
Update 操作
MongoDB 提供以下操作来更新 collection 中的 document
db.collection.updateOne()
(opens new window):更新一条 documentdb.collection.updateMany()
(opens new window):更新多条 documentdb.collection.replaceOne()
(opens new window):替换一条 document
语法格式:
【示例】插入测试数据
db.inventory.insertMany([
{
item: 'canvas',
qty: 100,
size: { h: 28, w: 35.5, uom: 'cm' },
status: 'A',
},
{ item: 'journal', qty: 25, size: { h: 14, w: 21, uom: 'cm' }, status: 'A' },
{ item: 'mat', qty: 85, size: { h: 27.9, w: 35.5, uom: 'cm' }, status: 'A' },
{
item: 'mousepad',
qty: 25,
size: { h: 19, w: 22.85, uom: 'cm' },
status: 'P',
},
{
item: 'notebook',
qty: 50,
size: { h: 8.5, w: 11, uom: 'in' },
status: 'P',
},
{ 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',
},
{
item: 'sketchbook',
qty: 80,
size: { h: 14, w: 21, uom: 'cm' },
status: 'A',
},
{
item: 'sketch pad',
qty: 95,
size: { h: 22.85, w: 30.5, uom: 'cm' },
status: 'A',
},
])
【示例】更新一条 document
db.inventory.updateOne(
{ item: 'paper' },
{
$set: { 'size.uom': 'cm', status: 'P' },
$currentDate: { lastModified: true },
}
)
【示例】更新多条 document
db.inventory.updateMany(
{ qty: { $lt: 50 } },
{
$set: { 'size.uom': 'in', status: 'P' },
$currentDate: { lastModified: true },
}
)
【示例】替换一条 document
db.inventory.replaceOne(
{ item: 'paper' },
{
item: 'paper',
instock: [
{ warehouse: 'A', qty: 60 },
{ warehouse: 'B', qty: 40 },
],
}
)
更新操作的特性:
- MongoDB 中的所有写操作都是单个文档级别的原子操作。
- 一旦设置了,就无法更新或替换
_id
(opens new window)字段。 - 除以下情况外,MongoDB 会在执行写操作后保留文档字段的顺序:
_id
字段始终是文档中的第一个字段。- 包括重命名字段名称的更新可能导致文档中字段的重新排序。
- 如果更新操作中包含
upsert : true
并且没有 document 匹配过滤器,MongoDB 会新插入一个 document;如果有匹配的 document,MongoDB 会修改或替换这些 document。
Delete 操作
MongoDB 提供以下操作来删除 collection 中的 document
db.collection.deleteOne()
(opens new window):删除一条 documentdb.collection.deleteMany()
(opens new window):删除多条 document
删除操作的特性:
- MongoDB 中的所有写操作都是单个文档级别的原子操作。
下一节:MongoDB 通过 db.collection.bulkWrite() (opens new window)方法来支持批量写操作(包括批量插入、更新、删除)。此外,db.collection.insertMany() (opens new window)方法支持批量插入操作。