MongoDB Shell CRUD
MongoDB 描述等存在参考官网及其他作者
系统环境:
- MongoDB 版本:community-4.4
参考地址:
相关配置等就不赘述了
一、MongoDB 简介
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,且与关系数据库的最为相像的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。Mongo 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
CRUD
CURD操作指的是文档的创建、读、更新以及删除操作。
插入文档
创建或插入操作会将新文档添加到集合中。 如果该集合当前不存在,则插入操作将创建该集合。
具体参数详情可见文章头部文档,不展开理解。
插入行为:
_id Field
在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id字段作为主键。 如果插入的文档省略_id字段,则MongoDB驱动程序会自动为_id字段生成ObjectId。
这也适用于通过upsert:true通过更新操作插入的文档。原子性
MongoDB中的所有写操作都是单个文档级别的原子操作。写确认书
对于写入问题,您可以指定从MongoDB请求的写入操作的确认级别。
insert()
db.collection.insert(
<document or array of documents>, #可以单个文档以及多个文档
{
writeConcern: <document>,
ordered: <boolean> #
}
)
参数 | 类型 | 描述 |
---|---|---|
document |
文档数组 | 要插入集合的文档或文档数组 |
writeConcern |
文档 | 可选的,写关注 |
ordered |
布尔值 | 是否按顺序插入 |
返回: 包含操作状态的WriteResult对象
仅简单介绍,详情其他参数可见文档
简单示例(对比 SQL):
# insert table(collection)(field1, field2)value(value1, value2)
db.collection.insert({ field1: value1, field2: value2 })
save()
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
仅简单介绍,详情其他参数可见文档
简单示例(对比 SQL):
# insert table(collection)(field1, field2)value(value1, value2)
db.collection.insert({ field1: value1, field2: value2 })
insertOne()
[推荐][version >= 3.2] 插入单条数据,返回一个文档,其中包含新插入的文档的_id字段值
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
参数 | 类型 | 描述 |
---|---|---|
document |
文档 | 要插入集合中的文档。 |
writeConcern |
文档 | 可选的,写关注 |
返回值:
参数 | 类型 | 描述 |
---|---|---|
acknowledged | 布尔值 | ture:带有写关注,false:禁用了写关注 |
insertedId | 字符型 | 返回插入的ObjectId,即_id |
仅简单介绍,详情其他参数可见文档
简单示例(对比 SQL):
# insert table(collection)(field1, field2) values (value1, value2)
db.collection.insertOne({ field1: value1, field2: value2 })
insertMany()
[推荐] [version >= 3.2] 插入多条数据
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
参数 | 类型 | 描述 |
---|---|---|
document |
文档 | 要插入集合中的文档数组。 |
writeConcern |
文档 | 可选的,写关注 |
ordered | 布尔值 | 可选的。一个布尔值,指定有序插入还是无序插入。默认为true 。 |
返回值:
参数 | 类型 | 描述 |
---|---|---|
acknowledged | 布尔值 | ture:带有写关注,false:禁用了写关注 |
insertedIds | 字符型 | 返回其中包含_id 每个成功插入的文档的值(插入的ObjectId,即_id) |
仅简单介绍,详情其他参数可见文档
简单示例(对比 SQL):
# insert into table(collection)(field1, field2) values (value1, value2),(value1, value2)
db.collection.insertMany(
[
{ field1: value1, field2: value2 },
{ field1: value1, field2: value2 }
]
})
查询文档
find()
db.collection..find(query, projection)
参数 | 类型 | 描述 |
---|---|---|
query |
文档 | 可选的,查询条件 |
projection |
文档 | 可选的,设置查询时文档返回的字段。 |
projection 语法
{ <field1>: <value>, <field2>: <value> ... }
参数 | 描述 |
---|---|
<field>: <1 or true> |
指定包含字段。 |
<field>: <0 or false> |
指定字段的排除。 |
…… | 更多可见文档 |
返回: 文档对象
简单示例(对比 SQL):
#SELECT * FROM table(collection)
db.collection.find({})
# = [相等]
#SELECT * FROM table(collection) WHERE field1 = value1
db.collection.find({ <field1>: <value1>, ... })
# and
#SELECT * FROM table(collection) WHERE field1 = value1 and field2 = value2
db.collection.find({ <field1>: <value1>, <field2>: <value2>, ... })
# and
#SELECT * FROM table(collection) WHERE field1 = value1 and field2 = value2
db.collection.find({ <field1>: <value1>, <field2>: <value2>, ... })
# OR
#SELECT * FROM table(collection) WHERE field1 = value1 OR field2 = value2
db.collection.find(
{
<field1>: <value1>,
$or: [{<field2>: <value2>}, ...]
}
})
# <
#SELECT * FROM table(collection) WHERE field1 < value1
db.collection.find({ <field1>: { $lt: value1 }, ... })
# >
#SELECT * FROM table(collection) WHERE field1 > value1
db.collection.find({ <field1>: { $gt: value1 }, ... })
# > and < [between]
#SELECT * FROM table(collection) WHERE field1 > value1 and field1 < value2
#SELECT * FROM table(collection) WHERE field1 between value1 and value2
db.collection.find({
<field1>: { $gt: value1 },
<field1>: { $lt: value2 }
})
查询条件相关语法后续会通过其他文章细说,可见官方文档
更新文档
update()
更新符合条件的所有数据
# update
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
参数 | 类型 | 描述 |
---|---|---|
query |
文档 | 可选的,查询条件 |
update |
文档 | 可选的,更新的文档。 |
返回值:
参数 | 类型 | 描述 |
---|---|---|
WriteResult | 文档或管道字符型 |
仅简单介绍,详情其他参数可见文档
简单示例(对比 SQL):
# update table(collection) where field1 = value1 SET field2 = value2 ,field3 = value3
db.collection.updateMany(
{ field1: value1 }, # update table(collection) where field1 = value1
{ # set field2 = value2 ,field3 = value3
field2: value2,
field3: value3
}
)
db.collection.updateMany(
{ field1: value1 }, # update table(collection) where field1 = value1
{
$set :{ # set field2 = value2 ,field3 = value3
field2: value2,
field3: value3
}
}
)
updateOne()
只会更新第一条数据
# updateOne
db.collection.updateOne(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
参数、返回值同 update()
简单示例(对比 SQL):
# update table(collection) where field1 = value1 SET field2 = value2 ,field3 = value3 limit 1
db.collection.updateOne( # limit 1
{ field1: value1 }, # update table(collection) where field1 = value1
{
field2: value2,
field3: value3
}
)
updateMany()
更新符合条件的所有数据
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
参数、返回值同 update()
简单示例(对比 SQL):
# update table(collection) where field1 = value1 SET field2 = value2 ,field3 = value3
db.collection.updateMany(
{ field1: value1 }, # update table(collection) where field1 = value1
{ # set field2 = value2 ,field3 = value3
field2: value2,
field3: value3
}
)
replaceOne()
替换除 _id 字段以外的文档的全部内容,第二个参数将新的文档赋值。
db.collection.replaceOne(
<filter>,
<replacement>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
hint: <document|string>
}
)
参数 | 类型 | 描述 |
---|---|---|
query |
文档 | 可选的,查询条件 |
replacement |
文档 | 可选的,要替换的文档。(_id不能替换) |
返回值:
参数 | 类型 | 描述 |
---|---|---|
WriteResult | 文档或管道字符型 | 关注:matchedCount[匹配文档的数量]、modifiedCount[修改文档的数量] |
仅简单介绍,详情其他参数可见文档
简单示例(对比 SQL):
# 用 SQL 的话,大致步骤分为,1、获取匹配的条件第一条的 id;2、通过主键更新所有值,存在删除及新增操作。【SQL不好描述】
# select id from table(collection) where field1 = value1 limit 1
# update table(collection) where id = {{id}} SET field1 = value1, field2 = value2 ,field3 = value3
db.collection.replaceOne(
{ field1: value1 },
{
field1: value1,
field2: value2,
field3: value3
}
)
MongoDB 另外提供 unset 的更新操作符来修改、删除字段值。格式如下:
update 格式如下:
{
<update operator>: { <field1>: <value1>, ... },
<update operator>: { <field2>: <value2>, ... },
...
}
详情可见文档
删除文档
指定过滤器(查询条件),以标识要删除的文档。 filter使用与读取操作相同的语法
deleteOne()
只会删除第一条数据
# deleteOne
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>,
hint: <document|string>
}
)
filter 格式:
{ <field1>: { <operator1>: <value1> }, ... }
参数 | 类型 | 描述 |
---|---|---|
filter | 文档 | 过滤条件,即与查询条件同等 |
writeConcern |
文档 | 可选的,写关注。文档 |
返回值:
参数 | 类型 | 描述 |
---|---|---|
WriteResult | 文档 | 包含 acknowledged[写确认],deletedCount[删除数量] |
仅简单介绍,详情其他参数可见[文档](https://docs.mongodb.com/manual/reference/method/db.collection.deleteOne/
简单示例(对比 SQL):
# delete table(collection) where field1 = value1 limit 1
db.collection.deleteOne({ field1: value1 })
deleteMany()
*删除所有复合条件的数据
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
参数、返回值同 deleteOne()
仅简单介绍,详情其他参数可见文档
简单示例(对比 SQL):
# delete table(collection) where field1 = value1
db.collection.deleteMany({ field1: value1 })
示例数据
查阅完上面的文档,在根据示例数据就更清晰。
# 创建集合 post
db.createCollection("post");
# 删除集合 post
db.post.drop();
# 插入测试数据
db.post.insert({
content: 'Content of Post One',
remark:'test1',
field01:'test1'
})
db.post.insert({
content: 'Content of Post Two',
remark:'test2',
field02:'test2'
})
# 批量插入测试数据 [10 万]
for (var i = 0; i < 100000; i++) {
db.post.insert({
"title": "title" + i,
"content": "content" + i,
"remark": "remark" + i
});
}
# 更新数据
db.post.update(
{"title":"Post one"},
{
$set:{"content":"content of test for update"}
}
);
db.post.update({"field02":"test"}, {$unset:{"field02":"test"}});
db.post.update({"title":"Post one"}, {$set:{"test_list":[1,2,3,4,5]}});
db.post.updateMany({"content":"Content of Post tree"}, {$push:{"test_list":[1,2,3,4,5]}});
# 删除数据
db.collection.remove(
{"title":"Content of Post Two"}
)
简单的测试数据示例下,后续会通过集成项目来演示。
备注:个人博客同步至简书。