Mongodb Shell命令执行以通过Node.js删除集合

时间:2018-08-23 11:38:24

标签: node.js mongodb

我有一个测试设置,其中使用mongoimportmongoexport命令来填充退出的mongoDB数据库,例如文件夹testDump中的testDB。 对于最初从中填充然后恢复testDB的文件夹中的空文件,会出现问题。

例如。 testDump中的一个名为abcInstance.json的收集文件为空。

$ cat abcInstance.json
[]

现在,当我运行一些测试时,此集合将填充到testDB中,但是最后,当我使用mongoimport命令从testDump文件夹还原所有集合时,对于空文件将失败。

因此,我试图使用mongo和spawn命令删除这些集合。

if (statSync(collectionFile).size === 4) {
const options = [
  'testDB',
  '--eval',
  '"db.abcInstance.drop()"'
];
const dropDB = spawn('mongo', options, { stdio: 'inherit' });
if (dropDB.status !== 0) {
  throw new Error('failed to drop collection ');
}}

但这也失败了,我无法弄清错误。 我已经测试过同一命令可以在命令行上成功运行:

$ mongo testDB --eval "db.abcInstance.drop()"
MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27017/alyneKickStartDB
MongoDB server version: 3.6.4
true

知道我要去哪里哪里吗?

1 个答案:

答案 0 :(得分:1)

因此,我能够通过here中所述的稍微不同的方法来解决执行mongo命令的问题。

基本上,我发现的问题是我的父进程正在退出而没有等待子进程完成执行,因为spawnexec都是异步函数。因此,我将代码修改如下:

const { promisify } = require('util');
const exec = promisify(require('child_process').exec)
async func test () {
    const res = await exec('mongo testDB --eval "db.abcInstance.drop()" --quiet')
    return { res }
}

现在,当我调用此test()函数时,我的收藏集已成功删除。

有人知道这种方法或更好的方法有什么问题吗?