【问题标题】:Mongo result docs not store as objectMongo 结果文档不存储为对象
【发布时间】:2016-08-26 19:01:43
【问题描述】:

我试图在执行查询后获取结果并将其存储在一个名为“模型”的变量中。

db.collection.findOne({object},function(err,docs){
     model["output"]= docs;
})

以上代码将模型[“输出”] 存储为“未定义”。我如何获得这个值?

对不起,没有足够的代码。

所以有两个文件。

文件1

dbStmtModel.insertRecords(collectionName, record).then(
function (results) {
    console.log("results",results);
    result = results;
 }, function (err){
      return err;
 });
  model[statement.output] = result;

文件2

函数 insertRecords(operand1,operand2){

    var deferred = q.defer();
    db.collection(operand1).update(operand2,operand2,{upsert:true},function (err,docs) {
        if(err) {
            deferred.reject(err);
        }
        else {
            deferred.resolve(docs);
        }
    });
    return deferred.promise

}

所以尝试使用 promises,尝试使用 async。似乎仍然没有得到模型存储查询结果的输出。此外,没有错误,因为回调正确返回并打印结果。我不确定我是否正确使用了 Promise,尽管控制台语句似乎可以正确打印结果。另外我使用 mongojs 而不是 mongoose 而不是 mongodb(因为这里的架构是动态的),不知道这是否会改变任何事情。

【问题讨论】:

标签: java node.js mongodb mongojs database


【解决方案1】:

首先,检查您忽略的错误参数

没有足够的代码可以确定,但我猜您之前在调用 findOne 的同一范围内定义了 model,然后您尝试使用 model['output']

这不起作用,因为findOne(几乎每个mongodb 驱动程序方法)都是异步,因此在您尝试使用model['output'] 之前不太可能调用它的回调。

您的问题没有快速解决方案,您需要了解异步性。结帐this答案。

【讨论】:

    【解决方案2】:
    db.collection.findOne({object},function(err,docs){
      model["output"]= docs;
    })
    

    首先 - 假设您的“模型”对象已定义。 (它会抛出模型未定义,而不是模型输出) 其次,您没有检查错误,如果有错误文档最终为空。 如果你仍然有未定义的。模型对象也可能存在错误。例如 - 检查它是否甚至是一个对象。

    db.collection.findOne({object}, (err, docs) => {
       if(err) {
          return console.log(err)
       }
       model.output = docs;
    }
    

    还有!我只是在猜测,但也许你正试图在 .findOne 范围之外使用它?我的意思是-这是异步调用。所以如果你做这样的事情

    db.collection.findOne({object}, (err, docs) => {
       if(err) {
          return console.log(err)
       }
       model.output = docs;
    }
    console.log(model.output);
    

    那么你的 model.output 是未定义的,因为你在数据库返回数据之前调用它 - 它不会等待。然后你必须使用回调(或承诺)。

    callDB (object, cb) => {
       db.collection.findOne(object, (err, docs) => {
         if(err) {
            return (err)
          }
          return (null, docs);
    
        }
    }
    

    那你可以叫它

    callDB({object}, (err, result) => {
       model.result = result;
    });
    

    但请注意,您对函数的新调用仍然是异步的。所以你的 model.result 仍然只能在其范围内工作。

    // 我看到你已经更新了你的问题,但我会留在这里。

    【讨论】:

      【解决方案3】:

      首先确保你得到你的结果做一个

      console.log("RESULT",docs) if you getting your results then try below methods 
      

      作为 mongo 查询返回 doc,这是一个不能修改的模型模式。 试试这个lean 它返回文档 JSON 对象

      var model={};
      db.collection.findOne({object},function(err,docs){
           model.output= docs;
      }).lean(true);
      

      var result={}
      db.collection.findOne({object},function(err,docs){
      result.model.output = docs;
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        相关资源
        最近更新 更多