为深度填充

时间:2016-04-17 11:05:18

标签: node.js sails.js populate

我试图深入填充一个集合。

例如

// UnitType.js
name: { type: 'string' }

// Unit.js
unitType: {
  model: 'unitType',
  via: '_id',
  required: true,
  index: true
}

// Product.js
unit: {
  model: 'unit',
  via: '_id',
  required: true,
  index: true
},

问题在于, - 据我所知,从互联网研究深入了解

Product.find().populate('unit.unitType');
帆中目前不支持

。为了达到我想要的结果

  • 使用填充unit
  • 查询产品
  • 查询具有来自`product.unit.unitType``
  • 的id的UnitTypes 带有回复的
  • .map() product.unit.unitType

这当然远非理想。我还尝试在模型中使用toJSON来预先填充" unitType - >没有工作,因为这不支持Promises。

在这个问题上,github上有很多线索和公关,但到目前为止我还没有找到解决这个问题的方法。有没有办法让这更好?

1 个答案:

答案 0 :(得分:6)

您可以尝试将Waterline ORM替换为Offshore ORM。帆有一个钩子可以做到这一点 - sails-hook-orm-offshore

实现现有项目非常容易,因为它的Waterline分支可以提供更多功能。只有我发现的是sails-hook-validation  停止了工作。

如何安装

npm install sails-hook-orm-offshore --save

<强>配置

.sailsrc

{
    "hooks": {
        "orm": false,
        "pubsub": false
    }
}

<强>默认值

config/globals.js

adapters: true,
models: true

<强>用法

现在,您可以在查询中deep populate。例如(来自文档):

User.find()
.populate('foo.bar', { name: 'foo' }) //populate foo into user and bar into foo
.exec(function(err, users) {
    console.log(users[0].foo.bar.name) // 'foo'
});

第二个选项

与水线合并深度

npm i Atlantis-Software/waterline#deepPopulate