Sails解决方案深入填充

Mar*_*kus 4 populate node.js sails.js

我正在尝试深入填充一个集合.

例如

// 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
},
Run Code Online (Sandbox Code Playgroud)

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

Product.find().populate('unit.unitType');
Run Code Online (Sandbox Code Playgroud)

目前帆不支持.为了达到我想要的结果

  • 查询带有populate的产品 unit
  • 查询具有来自`product.unit.unitType``的id的UnitTypes
  • .map() product.unit.unitType 随着回应

这当然远非理想.我也尝试toJSON在模型中使用"预先填充" unitType- >不起作用,因为这不支持Promises.

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

Bon*_*nza 6

您可以尝试使用Offshore ORM替换Waterline ORM.有一个帆可以做到这一点 - 帆 - 钩 - 海洋 - 近海.

它很容易实现到你现有的项目,因为它的Waterline分支更多功能.我发现只有sails -hook-validation 停止工作.

如何安装

npm install sails-hook-orm-offshore --save
Run Code Online (Sandbox Code Playgroud)

组态

.sailsrc

{
    "hooks": {
        "orm": false,
        "pubsub": false
    }
}
Run Code Online (Sandbox Code Playgroud)

默认

config/globals.js

adapters: true,
models: true
Run Code Online (Sandbox Code Playgroud)

用法

现在,您将被允许深入填充您的查询.例如(来自文档):

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'
});
Run Code Online (Sandbox Code Playgroud)

第二种选择

合并深水线与水线

npm i Atlantis-Software/waterline#deepPopulate
Run Code Online (Sandbox Code Playgroud)