読者です 読者をやめる 読者になる 読者になる

なっく日報

技術やら生活やらのメモ

coをasync.parallel的に動かす

ちょっと時間がないのでさっくりと。
DBは毎度おなじみのMongoです。

コード

'use strict';
const co = require('co');
const MongoClient = require('mongodb').MongoClient;

const MONGO_URL = 'mongodb://localhost:27017/test';

co(function* () {
  const filter = { _id: 'test-co' };

  // CONNECT
  const db = yield MongoClient.connect(MONGO_URL);

  // REMOVE
  yield db.collection('test').removeMany({ _id: /^co793/ });

  // UPDATE
  for (let i of ['a', 'b', 'c']) {
    const id = `co793-${i}`;
    const update = {
      $set: {
        _id: id,
        name: `なかむらco-${i}`,
      },
    };
    const opts = {
      upsert: true,
    };
    yield db.collection('test').updateOne({ _id: id }, update, opts);
  }

  // FIND parallel
  const result = yield {
    a: db.collection('test').findOne({ _id: `co793-a` }),
    b: db.collection('test').findOne({ _id: `co793-b` }),
    c: db.collection('test').findOne({ _id: `co793-c` }),
  };
  console.log(result);

  db.close();
}).catch((err) => {
  console.error(err.stack);
});

ポイント

  • yieldにオブジェクトを渡すとresultをオブジェクト形式で返せる。なお配列にすると配列で返る
  • 本当はbulkWriteで一括で書き込むべきだし、findManyで一括で取得するべき。あくまでもこれはサンプル