【TypeScript】MongoDBのBulkWriteと戦う
こんばんは葛の葉です。今回はMongoDBのBulkWriteについて書いていきます。
公式ドキュメントはこちら
MongoDB本体のドキュメント
NodeのMongoDBドライバーのドキュメント
version
packageのversionはこんな感じです。
{ "dependencies": { "mongodb": "^3.5.5" }, "devDependencies": { "typescript": "^3.8.3", "@types/mongodb": "^3.5.5" } }
docker-compose.ymlはこちら
version: "3" services: mongo: image: mongo:4.2.2-bionic ports: - 27017:27017
今回の記事に使用したGithubリポジトリはこちら
Bulk Writeって日本語でそもそもどんな意味なのだろう
Googleの翻訳結果では以下のようになりました。
Bulk Write
=> 一括書き込み
一括書き込み…そのまんまの意味だなぁ。
すなわち、同じコレクション内で複数の処理をMongoDBに依頼出来るということになるみたいです。
さっそく使ってみる
今回は事前にこのようなデータを入れてみる。
[ { name: "MoterCycle", colors: ["red", "blue", "green", "three"], like: true, }, { name: "Car", colors: ["blue", "red", "silver"], like: false, }, { name: "Bike", colors: ["yellow", "white", "silver"], like: false, }, ];
これらのドキュメントを以下のように変更しようと思います。
- nameがKickBoardのドキュメントを追加
- nameがCarのlikeプロパティをtrueに更新
- colorsプロパティにblueを持つドキュメントについてaonanokaプロパティ(true)を追加
これらをBulkWriteで書き込むことが出来ます。上記の変更を行うようなそれぞれのクエリを書き、それらクエリを配列に入れてbulkwrite
メソッドに渡せばよいのです。
const queries = [ // nameがKickBoardのドキュメントを追加 { insertOne: { document: { name: "KickBoard", colors: ["silver", "black"], like: false, }, }, }, // nameがCarのlikeプロパティをtrueに更新 { updateOne: { filter: { name: "Car" }, update: { $set: { like: true } }, }, }, // colorsプロパティにblueを持つドキュメントについてaonanokaプロパティ(true)を追加 { updateMany: { filter: { colors: "blue" }, update: { $set: { aonanoka: true } }, }, }, ]; await collection.bulkWrite(queries);;
最終的にはこのコレクションはこのようになります。_id
はMongoDBが勝手に発番する一意な番号です。
[ { _id: 5e9095000d4f3b2309188f89, name: 'MoterCycle', colors: [ 'red', 'blue', 'green', 'three' ], like: true, aonanoka: true }, { _id: 5e9095000d4f3b2309188f8a, name: 'Car', colors: [ 'blue', 'red', 'silver' ], like: true, aonanoka: true }, { _id: 5e9095000d4f3b2309188f8b, name: 'Bike', colors: [ 'yellow', 'white', 'silver' ], like: false }, { _id: 5e9095000d4f3b2309188f8c, name: 'KickBoard', colors: [ 'silver', 'black' ], like: false } ]
思ったとおり、やりたいことが出来たかとおもいます。