用来自 Mongodb find() 的结果填充数组

Fill array with results from Mongodb find()

本文关键字:结果 填充 数组 Mongodb find      更新时间:2023-09-26

在我的Mongodb数据库中,我有一组这种类型的文档(猫鼬描述):

{ colour: String, addedDate: {type: Date} }

例如,下面是数据示例:

{colour: 'white', addedDate: '2014-09-24T23:00:00.000Z'}
{colour: 'red', addedDate: '2014-09-24T23:00:00.000Z'}
{colour: 'white', addedDate: '2013-11-24T23:00:00.000Z'}
{colour: 'red', addedDate: '2012-09-24T23:00:00.000Z'}
{colour: 'white', addedDate: '2014-01-24T23:00:00.000Z'}
{colour: 'yellow', addedDate: '2014-09-24T23:00:00.000Z'},

我想获取某些颜色(在数组中指定),具有最新"addDate"的文档并将结果存储在数组中。

这是我的代码:

var Colour   = require('../app/models/colour');
var colours = ['white', 'red'];
var results = [];
for (var i = 0; i<colours.length; i++) {
    var name = colours[i];
    (function(output, colour_name) {
        Colour.find({name: colour_name})
            .sort('-addedDate').limit(1).exec(
                function (err, obj) {
                    if (err) return console.log(err);
                    output.push(obj);
                    console.log('output LOG:' + output);
                }
            );
    })(results, name);
}
// Now use the results array
console.log('OUTPUT:' results);

在"输出日志:"中,我得到了应有的数组输出(为了简单起见,我在这里没有显示_id):

output LOG: {colour: 'white', addedDate: '2014-09-24T23:00:00.000Z'} 
output LOG: {colour: 'white', addedDate: '2014-09-24T23:00:00.000Z'}, {colour: 'red', addedDate: '2014-09-24T23:00:00.000Z'}

但是,最终输出仍然是空的。

OUTPUT:

如何填充"结果"数组?事实上,我想把它传递给一个网页,所以我想在渲染页面之前提前收集这些颜色的所有结果。

猫鼬调用是异步的。发生的情况是,您将每个Color.find调用添加到事件队列中,然后在任何Color.find调用运行之前调用console.log('OUTPUT:', results);。这意味着在该时间点,您的数组为空。

溶液

传入剩余呼叫数和回调。查询完每种颜色后,您可以调用回调。这是一个小提琴

var colours = ['white', 'red'];
var result = {
   items: [],
   left: colours.length
};
function myCallback(param){
    console.log(param);
}
for(var i=0; i<colours.length; ++i){
    (function(results, colour_name, cb){
      ...
      setTimeout(function(){ // remove this, just simulating an async call
        // this should be inside the Color.find callback
        result.items.push(colour_name);
        result.left--;
        if (!result.left) {
          cb(result.items);
        }
      },0);
      ...
    }(result, colours[i], myCallback ));
}

可能传递给 exec 的函数作为其db操作异步运行,在这种情况下results数组在您记录它时不会被填充。

尝试:

setTimeout(function()
    console.log('OUTPUT:' results);
}, 1000);

检查是否是这种情况,假设数据库事务最多需要 1000 毫秒。

注意:这是一个猜测,因为我从未使用过node/mongo。

在本节中,

函数(输出, colour_name) {

    /* Fetch documents here and send to client from here */

})(结果,名称);

变量"results","name"被传递给函数,由于范围问题,这些值不会在外部更新(即使它们在内部更改)。

您可以获取文档

并在获取文档后立即将这些文档发送给客户端。