数据库
首页 > 数据库> > 使用javascript和node.js的mongoDB getLastError()不起作用

使用javascript和node.js的mongoDB getLastError()不起作用

作者:互联网

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

当我编写新功能时,我会使用它来测试我的应用程序.

我遇到的问题是,如果我在我的所有集合上调用drop(),然后调用一些插入来重新填充,有时我将记录的数据少于我期望插入数据库中,有时整个集合将丢失.我的计数检查所有说的#documents插入的匹配预期的数量,但整个集合可能会丢失,即使它说它已被插入.

我只能假设,因为它只发生了大约50%的时间,可能以某种方式插入在drop()完成之前开始插入然后drop()清除插入的文档,因为它运行异步.

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

所以我试图在drop()之后使用db.getLastError()来阻止插入,直到drop完成.

使用db.getLastError()或db.getlasterror()会引发错误:
TypeError:Object#< Db>没有方法’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中的代码示例中的getlasterror上找不到stackoverflow或web上的任何内容.

如果有更好的方法可以做到这一点,我会全力以赴.

js docs:http://docs.mongodb.org/manual/reference/javascript/#db.getLastError

mongo docs:http://www.mongodb.org/display/DOCS/getLastError+Command

—-更新2012年9月22日

使用下面的答案,我能够调试一下根本问题是什么,它就像我预期的那样.使用5个打开连接的默认连接池,随机触发掉线,然后插入.根据它们发送的顺序以及它们各自进入的池,如果一个drop快速完成,然后在该集合的drop完成之前快速插入,它将在以后删除插入的记录.

我的解决方法是在drop()命令的回调中将所有的drop连接在一个链接序列中,这样每次丢弃都会在前一个drop的回调被触发后发生,然后在最后调用一个回调来触发所有插入.它很乱,但我现在已经测试了initializedb函数大约25次,基本记录集包含20个简单插入,并且负载测试为100,000条记录.没有失败.

时间会告诉但是这个.lastError()答案可以解决这个问题.

—-更新2012年9月30日

我想测试一个星期左右,然后回复以确保它确实有效.我在上周运行了我的初始化脚本大约100次,基于26个记录的基本集合,并且所有100,000个记录都是批量插入的.我现在使用我的新代码时没有看到它失败.

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

DatabaseHandler.prototype.dropAll = function(callback, callbackArg) {
  // drop all the documents
  var that = this;
  var finished = callback || function() { };
  var finishedArg = callbackArg;
  this.companies.drop(function(err, reply) {
    if(reply) {
      console.log("[db] Companies collection dropped");
    } else {
      console.log("\033[31m[Error]\033[0m Companies collection failed to drop");
    }
    // drop all the user documents
    that.users.drop(function(err, reply) {
      if(reply) {
        console.log("[db] Users collection dropped");
      } else {
        console.log("\033[31m[Error]\033[0m Users collection failed to drop");
      }
      // drop all the course documents
      that.courses.drop(function(err, reply) {
        if(reply) {
          console.log("[db] Courses collection dropped");
        } else {
          console.log("\033[31m[Error]\033[0m Courses collection failed to drop");
        }
        // drop all the course purchase documents
        that.course_purchases.drop(function(err, reply) {
          if(reply) {
            console.log("[db] Course purchases collection dropped");
          } else {
            console.log("\033[31m[Error]\033[0m Course purchases collection failed to drop");
          }
          console.log("Dropped all documents and collections");
          return finished(finishedArg);
        });
      });
    });
  });
};

然后我有一个初始化函数,它接受一个参数来指定我是否需要额外的负载测试数据初始化(addloadtestdata).如果我指定dropdata它调用dropAll并采用initialize函数进行回调.所以当drop完成后,它会调用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);
}

希望有所帮助

解决方法:

您使用的是node-mongodb-native驱动程序吗?如果是这样,请查看lastError命令.

http://mongodb.github.com/node-mongodb-native/api-generated/db.html#lasterror

标签:javascript,mongodb,getlasterror
来源: https://codeday.me/bug/20190709/1413627.html