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

时间:2016-11-15 15:22:23

标签: node.js mongodb express

我正在尝试从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'
    });

  });

});

2 个答案:

答案 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){

   }