DAY6 MongoDB 资料新增(Insert) 与删除(Delete)

DAY6 MongoDB 资料新增(Insert) 与删除(Delete)

连线

连线方法如同前面文章提到的,这边就不再赘述了。

首先我们直接进入一个全新的资料库资料库 films

> use films
switched to db films
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>

这边可以看到虽然我们 use films,但只要还没有写入资料前,database 还不会真正建立出来,现阶段不需要担心。

Insert

建立一笔资料语法其实很简单 db.collection.insert() 即可。

> db.movie.insert({'name':'Lord of Databases'})
WriteResult({ "nInserted" : 1 })

我们在 movie collection 内写入名为 Lord of Databases 的资料。
可以看到系统回覆 nInserted:1 这是 number of inserted,也就是写入数量为 1 笔。

接着来查看这笔资料长什麽样子(查询语法之後会讲解)

> db.movie.find()
{ "_id" : ObjectId("612fb3ff761593c04673ee6f"), "name" : "Lord of Databases" }
>

如同之前文章所说,ObjectId 系统会自动帮你产生。

Collection 名称?

回头来看刚刚写入资料的语法
db.movie.insert({'name':'Lord of Databases'})

这是我们直接指定 collection 为 movie,完整的语法应该是:
db.getCollection('movie').insert({'name':'Lord of Databases'})

getCollection 是不是就没用了呢?
例如 collection 名称为 action.movie,那会发生什麽事?(action.movie 为合法的命名)

> db.action.movie.insert({'name':'Mission Possible'})
WriteResult({ "nInserted" : 1 })
> db.action.movie.find()
{ "_id" : ObjectId("612fb60a761593c04673ee70"), "name" : "Mission Possible" }
>

嗯好~就不会发生什麽事。

insert() vs insertOne() vs insertMany()?

  • insertOne 顾名思义就是写入一笔资料
> db.movie.insertOne({'name':'King of Databases'})
{
	"acknowledged" : true,
	"insertedId" : ObjectId("612fb6fe761593c04673ee71")
}
  • insertMany 顾名思义就是写入多笔资料
> db.movie.insertMany([
    {'name': 'Legend of MongoDB 1'}, 
    {'name': 'Legend of MongoDB 2'}
])
{
	"acknowledged" : true,
	"insertedIds" : [
		ObjectId("612fb770761593c04673ee72"),
		ObjectId("612fb770761593c04673ee73")
	]
}

可以看得出来使用 insertOneinsertMany 都会回传 ackowledged 以及 ObjectId,前者是用来确认 DB 确实写入资料了,後者就是回传写入的 ObjectId,这方便商务逻辑的使用,一来确认完成,二来可以拿着 _id 做後续操作。

那如果我都不需要呢?

答案是还是可以用 insert() 来办到

> db.movie.insert([{'name':'Test Movie 1'}, {'name': 'Test Movie 2'}])
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})
> db.movie.find()
{ "_id" : ObjectId("612fb3ff761593c04673ee6f"), "name" : "Lord of Databases" }
{ "_id" : ObjectId("612fb6fe761593c04673ee71"), "name" : "King of Databases" }
{ "_id" : ObjectId("612fb770761593c04673ee72"), "name" : "Legend of MongoDB 1" }
{ "_id" : ObjectId("612fb770761593c04673ee73"), "name" : "Legend of MongoDB 2" }
{ "_id" : ObjectId("612fb949761593c04673ee74"), "name" : "Test Movie 1" }
{ "_id" : ObjectId("612fb949761593c04673ee75"), "name" : "Test Movie 2" }
>

可以看到透过 insert() 也能够办到上述两种,且写入模式是 BulkWrite

Delete

MongoDB 删除资料方式其实也和写入差不多,语法有以下几种

db.collection.deleteOne({})
db.collection.deleteMany({})

大括弧 { } 里面是存放条件用的,如果不带条件则是删除第一笔 或是 全部删除

不过我想通常应该是不会全删除啦!要全删除应该会改用 drop

  • 删除全部资料:db.collection.deleteMany()
  • 删除整个 Collection(包含 Index):db.collection.drop()

*注:有些地方会看到 remove 语法,这个语法已经被废弃了,请不要再使用。

带条件删除资料

假设我们现在资料库有这些资料...

film> db.movie.find()
[
  { _id: ObjectId("6130e75b1235fc1679ee0cb0"), name: 'aaa' },
  { _id: ObjectId("6130e88b2d393aea8c0c8e63"), a: 1 },
  { _id: ObjectId("6130e88b2d393aea8c0c8e64"), b: 2 },
  { _id: ObjectId("6130e8a72d393aea8c0c8e65"), c: 'aaa' },
  { _id: ObjectId("6130e8ae2d393aea8c0c8e66") }
]

我们想删除最後一笔 { _id: ObjectId("6130e8ae2d393aea8c0c8e66") },它没有任何栏位,但别忘记,还有预设的 key 栏位,所以可以这样删除

film> db.movie.deleteOne({_id:ObjectId('6130e8ae2d393aea8c0c8e66')})
{ acknowledged: true, deletedCount: 1 }

其实删除栏位已经讲完了,那再演示一个 deleteMany 的方法,假设我们要删除 namedup 的资料:

film> db.movie.deleteMany({'name':'dup'})
{ acknowledged: true, deletedCount: 2 }
film> db.movie.find()
[
  { _id: ObjectId("6130e75b1235fc1679ee0cb0"), name: 'aaa' },
  { _id: ObjectId("6130e7951235fc1679ee0cb1"), name: 'bbb' },
  { _id: ObjectId("6130e7b22d393aea8c0c8e62"), name: 'c' },
  { _id: ObjectId("6130e88b2d393aea8c0c8e63"), a: 1 },
  { _id: ObjectId("6130e88b2d393aea8c0c8e64"), b: 2 },
  { _id: ObjectId("6130e8a72d393aea8c0c8e65"), c: 'aaa' },
  { _id: ObjectId("6130e9d8be17805b96148913"), "name" : "dup" }
  { _id: ObjectId("6130e9d8be17805b96148914"), "name" : "dup" }
]

可以看到 MongoDB 找到两笔符合条件的,就删除了。

划重点

MongoDB 在针对一笔资料操作时,都是俱备原子性(Atomic)的,但像上述 insertMany 这种,它是操作 多笔,不俱备原子性,所以可能会和其他操作相互穿插,但每一笔的写入还是有原子性喔!


本系列文章会同步发表於我个人的部落格 Pie Note


<<:  Day 1 前言

>>:  #6 CSS Table x Stock Price

[DAY 08] Elastic Load Balancer

ELB (Elastic Load Balancer) ELB 是一个托管的 load balanc...

Day-07 Logistic Regression 介绍

在前面两天我们已经说完基础的 Regression 跟 Classification 了,为什麽在...

【从实作学习ASP.NET Core】Day02 | MVC 的架构

MVC架构 MVC是软件工程中的一种软件架构模式,是基於关注点分离(seperation of co...

深入理解React Diff算法

点击进入React源码调试仓库。 上壹篇React状态计算解密 之後,我们来分析壹下Diff的过程。...

[13th][Day2] 第一个 Container

Docker 可以提供安全的沙盒环境来做测试, 建构多用户的 PaaS (platform as a...