sails.js waterline嵌套填充查询

时间:2015-04-12 10:49:42

标签: node.js sails.js waterline

我有一个find查询返回一个对象的多个结果,这个对象包含一个包含另一个模型的模型,问题是水线不支持嵌套的填充,所以它填充了第一个模型而不是它#&# 39;内在模式。

我见过的所有示例都是针对findOne查询的,我正在寻找一种方法来解决返回多个结果的查找查询。

这是我的模型结构:

// Container.js
widgets: {
  model: 'websitewidget'
}

// WebsiteWidget.js
html: {
  model: 'widgethtml'
}

// WidgetHtml.js
source: {
  type: 'String'
}

我的查询返回所有容器,并在其中填充WebsiteWidget,但不会填充WebsiteWidget中的WidgetHtml模型。

这是我的代码到目前为止,如果有人会告诉我我做错了什么,我将不胜感激:

async.auto({

          //First get the containers
          container: function(cb) {
              Container.find()
                  .where({
                      website: options.websiteId,
                      or: [
                          { 'layout': '' },
                          { 'layout': options.page.layout, page: (options.page.layout == 'default' ? 0 : options.page.id) } // TODO: perhaps there's a better way of doing it? instead of limiting page to default name.
                      ]
                  })
                  .populate('widgets')
                  .exec(cb);
          },

          // Then all of the widget's widgetHtmls, using an "in" query by
          // setting "id" criteria to an array of user IDs
          widgetsHtml: ['container', function(cb, results) {
              WidgetHtml.find({id: _.pluck(results.container.widgets, 'widgets')}).exec(cb);
          }],

          // Map the comment users to their comments
          map: ['widgetsHtml', function(cb, results) {
              // Index widget's widgetHtml by ID
              var widgetsHtml = _.indexBy(results.widgetsHtml, 'id');
              // Get a plain object version of container & widgets
              var container = results.container[0];
              // Map users onto comments
              container.widgets = container.widgets.map(function(widget) {
                  widget.widgetHtml = widgetsHtml[widget.widgetHtml];
                  return widget;
              });
              return cb(null, container);
          }]

      },
      // After all the async magic is finished, return the mapped result
      // (or an error if any occurred during the async block)
      function finish(err, results) {
          if (err) {return res.serverError(err);}
          return res.json(results.map);
      }
  );

0 个答案:

没有答案