我正在尝试从mongo db加载并显示一些信息。我的网站在node.js / express上运行。
我有两个表,第一个是调色板,我加载并显示所有,并且工作得很好。但是对于每个调色板,我都有一个示例列表。我想遍历每个调色板,并获得该调色板的所有示例。
我肯定做错了,我认为这是因为find()方法是异步的,所以我的数据在它提取额外数据之前就被发送了。但我不能将render函数放在示例的回调函数中,因为它运行了多次。
在PHP中,我曾经能够从另一个表中提取数据,并根据公共列将其连接到第一个表,但我不知道如何在此处执行此操作,这就是为什么我尝试手动执行此操作循环。
/* GET palette database main page. */
router.get('/', function(req, res, next) {
console.log('rendering test page');
var Palette = require('../models/paletteDatabase');
//load all palettes
Palette.find({}, function(err, palettes) {
if (err) return next(err);
var PaletteExamples = require('../models/paletteExamples');
for (var i = 0; i < palettes.length; i++) {
//split the colors into an array
palettes[i].colorsArray = palettes[i].colors.split(',');
PaletteExamples.find({paletteId: palettes[i]._id}, function(err, result) {
if (err) return next(err);
palettes[i].examples=result;
});
}
res.render('palette-database', {
title: 'Palette List',
palettes: palettes,
css: 'palette-db',
js: 'palette-db'
});
});
});
答案 0 :(得分:1)
利用汇总框架中的 $lookup
运算符来充分利用您的查询。这会对同一数据库中的另一个集合执行左外连接,以过滤来自&#34; join&#34;的文档。收集处理。
您可以使用此运算符运行聚合管道,如下所示:
/* GET palette database main page. */
router.get('/', function(req, res, next) {
console.log('rendering test page');
var Palette = require('../models/paletteDatabase');
// load all palettes
Palette.aggregate([
{
"$lookup": {
"from": "paletteExamples", // <-- collection name for examples
"localField": "_id",
"foreignField": "paletteId",
"as": "examples"
}
}
]).exec(function(err, docs){
var palettes = docs.map(function(doc){
doc["colorsArray"] = doc.colors.split(',');
return doc;
});
res.render('palette-database', {
title: 'Palette List',
palettes: palettes,
css: 'palette-db',
js: 'palette-db'
});
});
});
使用即将发布的MongoDB 3.4版本,您可以使用 $project
<在 $split
管道中引入新字段,从而在服务器上执行字符串拆分/ strong> oprrator如下:
// load all palettes
Palette.aggregate([
{
"$lookup": {
"from": "paletteExamples",
"localField": "_id",
"foreignField": "paletteId",
"as": "examples"
}
},
{
"$project": {
"examples": 1,
"colorsArray": { "$split": ["$colors", ","] },
/* project other fields as necessary */
}
}
]).exec(function(err, palettes){
res.render('palette-database', {
title: 'Palette List',
palettes: palettes,
css: 'palette-db',
js: 'palette-db'
});
});
答案 1 :(得分:0)
这就是如何删除for循环
var array = []; //your array
PaletteExamples.find({'label':
{$in: array}
},function(err, examples){
}