Mongoose / mongo将findOne存储到变量中

时间:2018-04-09 17:02:49

标签: node.js mongoose

我需要做findOne并将结果带到一个变量中以插入另一个集合中。     问题在于我有结果的内部功能,而且只是空的。

var rest = [];

function queryCollection(collection, callback, city){
    collection.findOne({cidade: city},function(err, result) {
        k = 1
        if (err) {
            console.log(err);
        } else if (k > 0) {
            console.log(result)//here have result
            rest.push(result);
            callback();
            console.log(rest)//here have result
            k - 1;
        }
    });
}

queryCollection(Location, function(){
    console.log(rest);
}, 'FATIMA');
console.log('out', rest)//HERE IS EMPTY, HOW CAN I USE REST VALUE?

1 个答案:

答案 0 :(得分:4)

以下是关于javascript的一些注意事项以及使用mongoose的一些示例。我希望它有所帮助!

  1. Javascript不一定按照您的语句出现在源代码中的顺序运行代码。
  2. 您在连接到数据库的mongoose中执行的任何操作都将是异步的。
  3. 根据你的问题松散地考虑这个人为的例子:

    'use strict';
    
    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test');
    const Schema = mongoose.Schema;
    
    const testSchema = new Schema({
      city: String
    });
    
    const Test = mongoose.model('test', testSchema);
    
    const test = new Test({
      city: 'Tucson'
    });
    
    function queryCollection() {
      console.log('queryCollection');
      Test.findOne({ city: test.city }, function (err, result) {
        console.log('findOne callback');
        if (err) {
          return console.error(err);
        } else {
          console.log(`result: ${result}`);
        }
      });
    }
    
    test.save(function (err, doc) {
      console.log('save callback');
      if (err) { return console.error(err); }
      queryCollection();
    });
    
    console.log('console.log');
    

    shell输出

    stack: node ./49738064.js
    console.log
    save callback
    queryCollection
    findOne callback
    result: { _id: 5acbd819e89388d34ea8d6a1, city: 'Tucson', __v: 0 }
    ^C
    stack:
    

    请注意,脚本的第一个输出是' console.log' 这是因为test.save()Test.findOne()是异步操作,这意味着他们需要时间来完成javascript不会等待。

    读取或写入网络,磁盘或数据库的功能通常称为“异步”和“异步”。除非他们以其他方式记录/命名。您需要在代码中考虑这种同步和异步操作的混合。

    历史上,这是通过回调完成的。如果有一些异步操作,则会将回调传递给该操作,该操作将处理异步调用的结果。

    从上面回到我们人为的例子:

    'use strict';
    
    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test');
    const Schema = mongoose.Schema;
    
    const testSchema = new Schema({
      city: String
    });
    
    const Test = mongoose.model('test', testSchema);
    
    const test = new Test({
      city: 'Tucson'
    });
    
    function queryCollection(done) {
      Test.findOne({ city: test.city }, function (err, result) {
        if (err) {
          return console.error(err);
        } else {
          done(result);
        }
      });
    }
    
    test.save(function (err, doc) {
      if (err) { return console.error(err); }
      queryCollection(console.log);
    });
    

    正如您所看到的,我将console.log函数作为异步查询操作的回调函数传递。您也可以编写自己的函数并将它们传递给它们。

    shell输出

    stack: node ./49738064.js
    { _id: 5acbd819e89388d34ea8d6a1, city: 'Tucson', __v: 0 }
    ^C
    stack:
    

    处理异步操作的一种更现代的方法是使用promises。 A Promise是一个对象,表示您正在执行的操作的未来结果。

    如果您没有传入回调函数,默认情况下所有的mongoose异步操作都会返回一个promise(或类似promise的对象)。因此,它们可以非常有效地与async / await一起使用。

    这是一个使用异步await和mongoose的例子:

    'use strict';
    
    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/test');
    const Schema = mongoose.Schema;
    
    const testSchema = new Schema({
      city: String
    });
    
    const Test = mongoose.model('test', testSchema);
    
    const test = new Test({
      city: 'Tucson'
    });
    
    function queryCollection() {
      return Test.findOne({ city: test.city });
    }
    
    async function run () {
      await Test.remove({}); // remove all existing documents
      await test.save(); // save the new document
      let found = await queryCollection();
      console.log(found);
    }
    
    run();
    

    shell输出

    stack: node ./49738064.js
    { _id: 5acbdf5dd8dc39d6065c820c, city: 'Tucson', __v: 0 }
    ^C
    stack: