DAY8 MongoDB 批次操作(bulk wirte) 与 Operators

DAY8 MongoDB 批次操作(bulk wirte) 与 Operators

bulk write

bulk write 乍听以为是批量写入资料,想了一下好像也说得通,但是 MongoDB 包含了更多各种操作,可以在一个指令内包含 Insert, Update, Delete 等动作,所以可以做更多事情,但千万要记得各个指令别互相打架啊....

先来看看 bulkWrite 长相:

db.collection.bulkWrite(
   [ <operation 1>, 
     <operation 2>, 
     ... 
   ],
   {
      writeConcern : <document>,
      ordered : <boolean>
   }
)

测试资料内容:

{ _id: ObjectId("61310798630faf5d23c909d3"), name: 'ErrorName' },
{ _id: ObjectId("61310798630faf5d23c909d4"), name: 'Arthas' },
{ _id: ObjectId("61310798630faf5d23c909d5"), name: 'Arthas' },
{
_id: ObjectId("61310798630faf5d23c909d6"),
name: 'NewThrall',
type: 'melee'
}

这次目标就来:

  • 删除 ErrorName (delete)
  • 将一个 Arthas 改名为 Jaina (update)
  • 写入一笔新资料 (insert)
db.upsert2.demo.bulkWrite([
  { deleteOne: { 
      "filter" : {'name':'ErrorName'} } 
  },
  { updateOne: { 
      "filter" : {'name':'Arthas'}, 
      "update" : { $set: {'name':'Jaina'} } } 
  },
  { insertOne: { 
      "document" : {'name':'Uther', 'class':'Paladin'} } 
  }
],
  { ordered: false }
);

执行结果:

film> db.upsert.demo2.bulkWrite([ { deleteOne: { "filter": { 'name': 'ErrorName' } } }, { updateOne: { "filter": { 'name': 'Arthas' }, "update": { $set: { 'name': 'Jaina' } } } }, { insertOne: { "document": { 'name': 'Uther', 'class': 'Paladin' } } }], { ordered: false });
{
  acknowledged: true,
  insertedCount: 1,
  insertedIds: { '0': ObjectId("61339d7e630faf5d23c909d8") },
  matchedCount: 1,
  modifiedCount: 1,
  deletedCount: 1,
  upsertedCount: 0,
  upsertedIds: {}
}
film> db.upsert.demo2.find()
[
  { _id: ObjectId("61310798630faf5d23c909d4"), name: 'Jaina' },
  { _id: ObjectId("61310798630faf5d23c909d5"), name: 'Arthas' },
  {
    _id: ObjectId("61310798630faf5d23c909d6"),
    name: 'NewThrall',
    type: 'melee'
  },
  {
    _id: ObjectId("61339d7e630faf5d23c909d8"),
    name: 'Uther',
    class: 'Paladin'
  }
]

坦白说我觉得语法实在不是很好记XD

ordered

ordered 参数预设值为 true
ordered 意思是指批次命令内,是否要由上到下依序执行,个人建议除非特殊需求或情境,否则依率将此参数设为 false。依照官网描述,设定为 false,有可能会使效能提升,冲着这点都值得了,但确实会有多少提升数据,并没有特别提到实验结果,毕竟每个条件和状况都不同,难以概括定论。

{ ordered: false } 以後几乎都会看到它。

查询用的 Operators

MongoDB 的运算子很丰富,所以一些很明确的我就不多做解释了。

  • $gt / $gte: Greater than / Greater than or equal
  • $lt / $lte: Less than / Less than or equal
  • $eq: Euqal
  • $in: 栏位存在於阵列内的任意值
  • $ne: Not euqal
  • $nin: Non in

会把 $ne$nin 特别列出来,是因为效能不彰,官方也不建议使用。

  • $and / $or
  • $not / $nor

以上两组四种就是程序常用的比较运算子。

  • $all: 查询阵列内的值都全都符合指定内容
[
  { arr: [a,b,c,d,e] },
  { arr: [a,e] },
  { arr: [b,c,d,e] },
  { arr: [a,b,c,d] }
]

查询 { arr: { $all : [a,e] } } 会得到

[
  { arr: [a,b,c,d,e] },
  { arr: [a,e] }
]

(没特别加上字串单引号)

  • $elemMatch: 就是针对阵列内的值进行查询
  • $size: 取得阵列的 size

上面三种为 Array 型别栏位专用的运算子。

  • $exists: 指定栏位是否存在

我们测试资料有这些,想要找出 class 栏位存在的资料,就会这样操作:

film> db.upsert.demo2.find()
[
  { _id: ObjectId("61310798630faf5d23c909d4"), name: 'Jaina' },
  { _id: ObjectId("61310798630faf5d23c909d5"), name: 'Arthas' },
  {
    _id: ObjectId("61310798630faf5d23c909d6"),
    name: 'NewThrall',
    type: 'melee'
  },
  {
    _id: ObjectId("61339d7e630faf5d23c909d8"),
    name: 'Uther',
    class: 'Paladin'
  }
]
film> db.upsert.demo2.find({'class': {$exists: true}})
[
  {
    _id: ObjectId("61339d7e630faf5d23c909d8"),
    name: 'Uther',
    class: 'Paladin'
  }
]
film>

查询用的 operator 大致介绍到这边,明天来看如何进行查询。


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


<<:  方法的输入处理,其实不简单!

>>:  Day08-import/export

# Day17--那天....我学Wendy跪着读完的OOP

什麽是物件导向? 为什麽需要物件导向? 物件导向重要在什麽地方? 要回答第一个问题前,必须先回答一...

#16. Quiz App(原生JS版)

#16. Quiz App 所谓Quiz App就是提供给用户答题的小应用,包含数个选择题,选完一个...

第 28 集:Bootstrap 客制化 component 元件样式

此篇会介绍如何修改 Bootstrap 元件样式。 事前准备 须先了解变数设置、通用类别设置,再继...

D9 文件系统核心开始 系统页面功能规划

今天先来规划一下後续的系统架构 先用文字版 等做完了再补上图片 首先使用者进入会先到首页 首页 使用...

[Day12]程序菜鸟自学C++资料结构演算法 – 树Tree

前言:相信大家对於「树」都不陌生,资料结构中的树其实是模拟现实生活中的树干、树枝和叶子,相当於树状结...