根据mongo db中第一个表的结果从第二个表中加载数据

我正在尝试加载并显示来自mongo db的一些信息。 我的网站在node.js / express上运行。

我有两个表,第一个是调色板,我加载和显示所有的,而且工作得很好。 但对于每个调色板,我有一个例子列表。 我想遍历每个调色板,并获取该调色板的所有示例。

我肯定是做错了,我想这是因为find()方法是asynchronous的,所以我的数据发送之前,它拉额外的数据。 但是我不能把render函数放在callback中,因为它是多次运行的。

在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' }); }); }); 

充分利用您在聚合框架中find的$lookup操作符的查询。 这会将左外连接添加到同一个数据库中的另一个集合,以过滤“已连接”集合中的文档进行处理。

您可以使用此运算符运行聚合pipe道,如下所示:

 /* 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版本中,您可以通过在$projectpipe道中使用$split oprrator引入新字段来执行服务器上的string拆分,如下所示:

 // 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' }); }); 

这是如何可以删除for循环

 var array = []; //your array PaletteExamples.find({'label': {$in: array} },function(err, examples){ }