javascript - `bulkWrite` 和 `insertOne/updateOne` 在 mongodb 中不能像我预期的那样工作?

标签 javascript mongodb

我在 bulkWrite 中有 insertOneupdateOne 如下:

async function bulkWrite(users) {
  await users.bulkWrite([
    {
      insertOne: {
        document: {
          name: 'bulk-insert1',
          age: 100
        }
      },
      updateOne: {
        filter: {
          name: 'mongodb'
        },
        update: {
          $set: {
            age: 200
          }
        }
      }
    }
  ])
}

我预计它会插入一个新文档并更新一个现有文档,但结果不同。

我的主要功能:

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/";

const DB_NAME = 'javascript-mongodb-bulkwrite-demo';
const COLLECTION_NAME = 'users';

async function run() {
  const mongo = await MongoClient.connect(url, {useNewUrlParser: true});
  const db = mongo.db(DB_NAME);

  await clearDb(db);

  const users = await db.createCollection(COLLECTION_NAME);

  await createUsers(users);

  await printUsers(users);

  await bulkWrite(users);

  await printUsers(users);

  await mongo.close()
}

run();

它使用的其他功能:

async function clearDb(db) {
  console.log('------- clearDb --------');
  const collections = await db.collections();
  await Promise.all(collections.map(async it => {
    await it.drop();
  }));
}

async function createUsers(users) {
  console.log('------- createUsers --------');
  users.insertMany([
    {
      name: 'javascript',
      age: 10
    }, {
      name: 'mongodb',
      age: 20
    }
  ])
}

async function printUsers(users) {
  console.log('------- printUsers --------');
  await users.find().forEach(user => {
    console.log(user);
  })
}

bulkWrite 函数:

async function bulkWrite(users) {
  console.log('------- bulkWrite --------');
  return await users.bulkWrite([
    {
      insertOne: {
        document: {
          name: 'bulk-insert1',
          age: 100
        }
      },
      updateOne: {
        filter: {
          name: 'mongodb'
        },
        update: {
          $set: {
            age: 200
          }
        }
      }
    }
  ])
}

当前结果如下:

------- clearDb --------
------- createUsers --------
------- printUsers --------
{ _id: 5c10b6011dd87efa7feb5b47, name: 'javascript', age: 10 }
{ _id: 5c10b6011dd87efa7feb5b48, name: 'mongodb', age: 20 }
------- bulkWrite --------
------- printUsers --------
{ _id: 5c10b6011dd87efa7feb5b47 }
{ _id: 5c10b6011dd87efa7feb5b48, name: 'mongodb', age: 20 }

我希望最后一部分是:

{ _id: 5c10b6011dd87efa7feb5b47, name: 'javascript', age: 10 }
{ _id: 5c10b6011dd87efa7feb5b48, name: 'mongodb', age: 20 }
{ _id: 5c10b6011dd87efa7feb5b49, name: 'bulk-insert1', age: 100 }

我还为此创建了一个演示项目,您可以克隆并运行它:

https://github.com/freewind-demos/javascript-mongodb-bulkwrite-demo

(我将当前代码锁定到issue分支)

最佳答案

这只是一个错字。您错过了批量操作之间的一对大括号。

应该是:

  const res = await users.bulkWrite([
    {
      insertOne: {
        document: {
          name: 'bulk-insert1',
          age: 100
        }
      } 
    }, { 
      updateOne: {
        filter: {
          name: 'mongodb'
        },
        update: {
          $set: {
            age: 200
          }
        }
      }
    }
  ]);

关于javascript - `bulkWrite` 和 `insertOne/updateOne` 在 mongodb 中不能像我预期的那样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738254/

相关文章:

javascript - 你为什么要执行 $q.when() 而不给它传递一个 promise /值?

ruby - 如何在 mongoDB 中展平双数组?

mongodb - $and 运算符在 mongo 中进行多个 $text 搜索

mongodb - 使用 mongo ObjectId 作为用户 ID 是不好的做法吗?

json - '如何通过 node.js mongodb 驱动程序有效地流式传输大型 json 文档?

javascript - MongoError : cannot change _id of a document

javascript - 拉斐尔线图动画和更新图

javascript - 我无法将 JSON 数据放入数组中

javascript - 访问 javascript 对象中的属性的奇怪行为

javascript - 使用媒体片段循环播放视频?