javascript和node.js不工作的mongoDB getLastError()

javascript和node.js不工作的mongoDB getLastError(),javascript,mongodb,getlasterror,Javascript,Mongodb,Getlasterror,我有一个使用mongoDB的node.js应用程序,我有一个函数,用于删除集合中的所有文档,然后用一些示例文档重新填充数据库中的集合 当我编写新功能时,我偶尔会用已知数据测试我的应用程序 我遇到的问题是,如果我对所有集合调用drop(),然后调用一些insert来重新填充,有时我的记录会比预期的要少,有时整个集合会丢失。“我的计数”检查所有与预期数量匹配的插入记录,但整个集合可能会丢失,即使它说它已插入 我只能假设,因为只有大约50%的时间插入在drop()完成之前开始插入,然后drop()清除

我有一个使用mongoDB的node.js应用程序,我有一个函数,用于删除集合中的所有文档,然后用一些示例文档重新填充数据库中的集合

当我编写新功能时,我偶尔会用已知数据测试我的应用程序

我遇到的问题是,如果我对所有集合调用drop(),然后调用一些insert来重新填充,有时我的记录会比预期的要少,有时整个集合会丢失。“我的计数”检查所有与预期数量匹配的插入记录,但整个集合可能会丢失,即使它说它已插入

我只能假设,因为只有大约50%的时间插入在drop()完成之前开始插入,然后drop()清除插入的文档,因为它是异步运行的

我在所有insert/update命令上使用{safe:true},但db.collection.drop()不接受任何参数,而且似乎无法指定安全选项

因此,我尝试在drop()之后使用db.getLastError()来阻止插入,直到drop完成

使用db.getLastError()或db.getLastError()会引发错误: TypeError:对象#没有方法“getlasterror”

对getLastError的简化调用:

var mongo = require("mongodb");

  var db_conn = new mongo.Db(dbName, new mongo.Server(host, port, { auto_reconnect: true }), {});
  db_conn.open(function(err, db) {
    if(!err) {
      console.log("Database connection: \033[32mopen\033[0m");
    } else {
      console.log("Database connection: \033[31mfailed\033[0m");
    }
  });
  db_conn.getLastError();
  this.db_conn = db_conn;
  this.users = db_conn.collection("users");
  this.companies = db_conn.collection("companies");
  this.suppliers = db_conn.collection("suppliers");
我在mongodb模块1.1.4版和1.1.7版上尝试过这个,但发现了一个错误

我使用了错误的参考资料吗?在JavaScript代码示例中,我在stackoverflow或web上找不到任何关于getlasterror的信息

如果有更好的办法,我洗耳恭听

js文档:

mongo文档:

----更新日期:2012年9月22日

使用下面的答案,我可以稍微调试一下根本问题是什么,这是我所期望的。在默认连接池中有5个打开的连接时,删除会随机触发,然后插入。根据它们被发送的顺序以及它们各自进入的池,如果一次删除很快完成,然后在该集合的删除完成之前很快进行插入,则稍后将删除插入的记录

我的修复方法是在drop()命令的回调中以链接顺序包装所有的drop,这样每个drop都发生在前一个drop的回调被触发之后,然后在最后调用一个回调,该回调触发所有插入。这很混乱,但我现在已经用20个简单插入的基本记录集和100000条记录的负载测试测试了initializedb函数25次。还没有失败

时间会告诉我们,但这个.lastError()答案解决了这个问题

----更新日期:2012年9月30日

我想在回复之前测试一周左右,以确保它确实有效。在过去的一周里,我已经运行了大约100次初始化脚本,基本记录集为26条,并且批量插入了100000条记录集。现在使用我的新代码,我还没有看到它失败过一次

用于删除集合的代码:(我有一个DatabaseHandler对象,用于操作的原型函数)

然后我有一个initialize函数,它接受一个参数来指定是否需要额外的负载测试数据初始化(addloadtestdata)。如果我指定dropdata,它将调用dropAll并使用初始化函数进行回调。因此,当删除完成时,它调用initialize回调并仅在完成删除后才开始重新添加文档。 我还有一个小计数函数,它可以检查插入完成后插入的文档数量,并验证插入的文档数量是否正确,是否没有遗漏任何文档。这可能是我添加的最好的功能,因此每次初始化时,我都可以查看插入的文档的确切数量是否正确,或者是否缺少1个文档

function initialize(doLoadtest){
  // do work here
}
// drop all collections and documents
if(dropdata) {
  // drop all the data first then call the initialize as a callback function when completed dropping
  Database.dropAll(initialize, includeLoadtestData);
} else {
  initialize(includeLoadtestData);
}

希望对您有所帮助

您是否正在使用节点mongodb本机驱动程序?如果是,请查看lastError命令


我在运行摩卡测试时也遇到类似问题。这绝对是一个时间问题。我还设置了
{safe:true}
,但似乎没有多大区别。我设置了1秒的
setTimeout
,以解决这个问题(但仅在测试中)。现在它95%的时间都能工作。你能发布你最终使用的代码吗?上面添加了代码示例是的,先生!这是我正在使用的驱动程序,它工作正常。不知道为什么他们不使用普通的api名称,但是lastError()可以工作。
function initialize(doLoadtest){
  // do work here
}
// drop all collections and documents
if(dropdata) {
  // drop all the data first then call the initialize as a callback function when completed dropping
  Database.dropAll(initialize, includeLoadtestData);
} else {
  initialize(includeLoadtestData);
}