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)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
参数预设值为 true
。
ordered 意思是指批次命令内,是否要由上到下依序执行,个人建议除非特殊需求或情境,否则依率将此参数设为 false
。依照官网描述,设定为 false
,有可能会使效能提升,冲着这点都值得了,但确实会有多少提升数据,并没有特别提到实验结果,毕竟每个条件和状况都不同,难以概括定论。
{ ordered: false }
以後几乎都会看到它。
MongoDB 的运算子很丰富,所以一些很明确的我就不多做解释了。
会把 $ne
与 $nin
特别列出来,是因为效能不彰,官方也不建议使用。
以上两组四种就是程序常用的比较运算子。
[
{ 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] }
]
(没特别加上字串单引号)
上面三种为 Array 型别栏位专用的运算子。
我们测试资料有这些,想要找出 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
什麽是物件导向? 为什麽需要物件导向? 物件导向重要在什麽地方? 要回答第一个问题前,必须先回答一...
#16. Quiz App 所谓Quiz App就是提供给用户答题的小应用,包含数个选择题,选完一个...
此篇会介绍如何修改 Bootstrap 元件样式。 事前准备 须先了解变数设置、通用类别设置,再继...
今天先来规划一下後续的系统架构 先用文字版 等做完了再补上图片 首先使用者进入会先到首页 首页 使用...
前言:相信大家对於「树」都不陌生,资料结构中的树其实是模拟现实生活中的树干、树枝和叶子,相当於树状结...