如何在Mongoose中填充嵌套数组

时间:2018-02-01 14:28:41

标签: node.js mongodb mongoose

我被困在填充我的阵列......这是我从Terminal.find()函数得到的:

{ _id: 5a7300046f18140d5081be83,
  type: 5a71a22b0d4a2d0ec3b91edc,
  serial: '213',
  macAddress: 'E1:12:BE:82:12',
  barcode: '1243w464563',
  dateArrival: 2018-02-01T11:54:15.870Z,
  firmware: 5a71a2030d4a2d0ec3b91edb,
  installedAt: 5a61e547922c6d28e324d775,
  installedAtBranch: 5a7054713fe20c0c5a94fb11,
  __v: 0,
  deleted: false,
  activated: true }

所以我希望在用户搜索终端时获得正确的信息。这就是为什么我必须使用populate()。我现在很困难的是在阵列内部填充更深的东西。所以第一个对象type有一个readMethod,一个layoutinterfaces - 我必须填充这三个,但我不知道如何。 interfaces是我的数据库中的一个对象,这使事情更加严重。所以我的type看起来像这样: enter image description here

我认为如果有人可以告诉我如何填充type所有interfaces我可以自己完成其余的事情。

提前致谢!

我通过在谷歌内部深入搜索找到了答案:

Terminal.findOne({'barcode': barcode})
        .populate({ 
            path: 'type',
            populate: [{
                path: 'user',
                model: 'User'
            },
            {
                path: 'method',
                model: 'Method',
            },
            {
                path: 'layout',
                model: 'Layout'
            },
            {
                path: 'interfaces',
                model: 'Interface'
            }]
        })
        .populate('firmware')
        .populate('customerId')
        .populate('branchId')
        .exec( function (err, terminal) {
        if (err) {
            res.status(500).send(err);
        }
        res.json({ terminal });
    });

1 个答案:

答案 0 :(得分:1)

当您使用猫鼬时,我认为您的模型应该如下所示,或者它必须如下所示

终端类型架构

var terminalTypeSchema = new Schema({
    articlenumber: { type: Number, default: something },
    readMethod: Schema.ObjectId,
    layout: Schema.ObjectId,
    interfaces: [{ type: Schema.ObjectId, ref: 'User' }]
});
mongoose.model('TerminalType', terminalTypeSchema);

接口架构

var interfaceSchema = new Schema({
    // some vars
});
mongoose.model('Interface', interfaceSchema);

现在运行以下查询

TerminalType.findOne({ _id: terminalTypeId})
.populate('interfaces') // <==
.exec(function(err, terminalTypes){
    // You can achieve the rest on your own.
});