node.js - nodejs mongodb express如何将一对多的两个表合并为一个json对象返回
阿神
阿神 2017-04-17 12:03:18
[Node.js讨论组]

第一次用nodejs mongodb express做项目
两个表,部门、人员。人员里面有一个属性存放部门id

现在想将这两个表的结果拼成如下格式返回给浏览器:

    [
        {
            name:'部门名称',
            people:[人员对象数组]
        },
        {第二个部门}
        ...
    ]

首先查出所有的部门,在回调里面获得到了所有部门的数组,但是接下来就没办法了,根据部门查找到的人员数组必须在下级查询的回调里面才能获得,想不到什么办法可以用来添加到上级回调的部门数组里面。

    (伪代码)
    db.部门.find({},function(err,objs1){
        for(let i of objs1){
            db.人员.find({部门id:i._id},function(err,objs2){
                i.people=objs2;
                //由于异步的问题,在这里修改objs1显然是没用的,然后就想不到该怎么做了
            });
        }
        res.send(objs1);
    })

也查了很多东西,promise、generator、async,也自己写了函数试验,但是对于数据库自带的api,他就是用的原始的异步回调的方式,拿他没辙啊
求教改如何处理?

阿神
阿神

闭关修行中......

全部回复(1)
巴扎黑

有两个方法,一是使用 mongoose 的 ref 来组织部门数据,另外一个办法是分别读取部门和人员信息,再对应后组装数据。

使用 ref

在人员的 Schema 里,做如下的设置:

var PeopleSchema = new mongoose.Schema({
  depart: {
    type: mongoose.Schema.ObjectId,
    ref: 'Depart'
  }
});

然后,在获取人员信息的时候,使用 populate 方法:

People.find().populate('depart').exec(function(err, docs){
   //...
});

你可以打印一下结构看一下具体的数据组织。

分别查询再组装

大概实现的代码如下:

var peoples = null, departs = null, flag = 0;

People.find().exec(function(err, docs){
  if(err) {
    // handle error
  }
  peoples = docs;
  goon(++flag);
});

Depart.find().exec(function(err, docs){
  if(err) {
    // handle error
  }

  departs = docs;
  goon(++flag);
});

function goon() {
  if(2 !== flag) return;

  //organize your data with peoples and departs
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号