用来自 Mongodb find() 的结果填充数组
Fill array with results from Mongodb find()
在我的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"被传递给函数,由于范围问题,这些值不会在外部更新(即使它们在内部更改)。
您可以获取文档并在获取文档后立即将这些文档发送给客户端。
相关文章:
- 如何在下拉列表更改时自动填充mysql查询结果中的文本框值
- 停止 jQuery 自动完成以过滤/搜索结果并填充整个源数组数据
- 第二个Ajax调用已经填充了成功结果
- 使用JavaScript返回click-li项目的值,并用结果填充文本区域
- 调用 HTTP get 方法以使用 angular JS 在下拉列表中填充结果
- 用 Web 服务结果填充变量
- 使用下拉列表中的值查询 MySQL 数据库,然后使用结果填充文本字段而不刷新页面
- 节点猫鼬填充条件不返回预期结果
- 从 AJAX JSON 结果数据填充选择列表
- 如何使用垂直和水平结果填充表
- 根据第一个下拉列表结果填充第二个下拉列表
- Jquery自动完成-不要用结果填充输入框
- 如何自动填充并启用从外部网站提交和检索结果
- onClick需要两次点击才能填充结果HighCharts
- 用实例方法的结果填充集合中每个项目的属性
- 我可以基于查找结果填充查找/选项集吗?
- jQuery克隆元素,然后用连接的结果填充隐藏字段,以避免空列表问题
- 用网格的结果填充表单
- 使用jQuery Ajax结果填充自定义JavaScript对象
- 如何从ajax数据结果填充javascript数组