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(
   <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 另外提供 set、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"}
 )

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

备注:个人博客同步至简书。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容