MongoDB Shell CRUD

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(
   , #可以单个文档以及多个文档
   {
     writeConcern: ,
     ordered:  # 
   }
)
参数 类型 描述
document 文档数组 要插入集合的文档或文档数组
writeConcern 文档 可选的,写关注
ordered 布尔值 是否按顺序插入

返回: 包含操作状态的WriteResult对象

仅简单介绍,详情其他参数可见文档

简单示例(对比 SQL):

# insert table(collection)(field1, field2)value(value1, value2)
db.collection.insert({ field1: value1, field2: value2 })
save()
db.collection.save(
   ,
   {
     writeConcern: 
   }
)

仅简单介绍,详情其他参数可见文档

简单示例(对比 SQL):

# insert table(collection)(field1, field2)value(value1, value2)
db.collection.insert({ field1: value1, field2: value2 })
insertOne()

[推荐][version >= 3.2] 插入单条数据,返回一个文档,其中包含新插入的文档的_id字段值

db.collection.insertOne(
   ,
   {
      writeConcern: 
   }
)
参数 类型 描述
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(
   [  , , ... ],
   {
      writeConcern: ,
      ordered: 
   }
)
参数 类型 描述
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 语法

{ : , :  ... }
参数 描述
: <1 or true> 指定包含字段。
: <0 or false> 指定字段的排除。
…… 更多可见文档

返回: 文档对象

简单示例(对比 SQL):

#SELECT * FROM table(collection)
db.collection.find({})

# = [相等]
#SELECT * FROM table(collection) WHERE field1 = value1
db.collection.find({ : , ... })

# and
#SELECT * FROM table(collection) WHERE field1 = value1 and field2 = value2
db.collection.find({ : , : , ... })

# and
#SELECT * FROM table(collection) WHERE field1 = value1 and field2 = value2
db.collection.find({ : , : , ... })

# OR
#SELECT * FROM table(collection) WHERE field1 = value1 OR field2 = value2
db.collection.find(
   { 
     : , 
     $or: [{: }, ...]
   } 
})

# < 
#SELECT * FROM table(collection) WHERE field1 < value1
db.collection.find({ : { $lt: value1 }, ... })

# > 
#SELECT * FROM table(collection) WHERE field1 > value1
db.collection.find({ : { $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({
    : { $gt: value1 },
    : { $lt: value2 } 
})

查询条件相关语法后续会通过其他文章细说,可见官方文档

更新文档

update()

更新符合条件的所有数据

# update
db.collection.update(
   ,
   ,
   {
     upsert: ,
     multi: ,
     writeConcern: ,
     collation: ,
     arrayFilters: [ , ... ],
     hint:  
   }
)
参数 类型 描述
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(
   ,
   ,
   {
     upsert: ,
     multi: ,
     writeConcern: ,
     collation: ,
     arrayFilters: [ , ... ],
     hint:  
   }
)

参数、返回值同 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(
   ,
   ,
   {
     upsert: ,
     writeConcern: ,
     collation: ,
     arrayFilters: [ , ... ],
     hint:  
   }
)

参数、返回值同 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(
   ,
   ,
   {
     upsert: ,
     writeConcern: ,
     collation: ,
     hint: 
   }
)
参数 类型 描述
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 格式如下:

{
  : { : , ... },
  : { : , ... },
  ...
}

详情可见文档

删除文档

指定过滤器(查询条件),以标识要删除的文档。 filter使用与读取操作相同的语法

deleteOne()

只会删除第一条数据

# deleteOne
db.collection.deleteOne(
   ,
   {
      writeConcern: ,
      collation: ,
      hint: 
   }
)

filter 格式:

{ : { :  }, ... }
参数 类型 描述
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(
   ,
   {
      writeConcern: ,
      collation: 
   }
)

参数、返回值同 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"}
 )

简单的测试数据示例下,后续会通过集成项目来演示。

备注:个人博客同步至。

你可能感兴趣的:(MongoDB Shell CRUD)