【问题标题】:At Sails.js, how can I query a model with criteria at associations在 Sails.js,我如何在关联中使用标准查询模型
【发布时间】:2016-12-10 15:10:17
【问题描述】:

在 Sails.js(使用 Waterline ORM)中,我如何查询仅在条件适合关联时才返回记录的模型。以下是代码:

Order.find()
.populate('books', {title: {startsWith: 'Star Trek'}})
.exec(function (err, foundOrders) {
  ....
});

型号如下:

订单:

module.exports = {
  attributes: {
    ...
    books: {
      collection: book,
      via: order
      through: orderbook
    }
}

书:

module.exports = {
  attributes: {
    ....
    order: {
      collection: order,
      via: book
      through: orderbook
  }
}

订单簿:

module.exports = {
  attributes: {
    order: {
      model: order
    },
    book: {
      model: book
    }
  }
}

我发现结果记录集是所有订单。只是每个订单的填充结果仅包含标题以“星际迷航”开头的书籍。

这不是我想要的。我想退回只有标题以“星际迷航”开头的书籍的订单。

请任何人都可以建议如何正确处理我的查询语句?

【问题讨论】:

  • 为了进一步澄清我的问题,上面的代码将获取所有订单记录。那些没有书籍标题以“星际迷航”开头的订单将有一个空的书籍数组。我想要得到的是代码应该返回一系列书籍的顺序,这些书籍的标题仅以“星际迷航”开头。应排除具有空书阵列的订单。我怎么得到它?现在我需要在得到结果后应用一个数组过滤器。有没有更好的办法?

标签: sails.js


【解决方案1】:

当你检查:http://sailsjs.com/documentation/reference/waterline-orm/queries/populate,你会发现:

Something.find() .populate(关联,子标准) .exec(之后的函数(错误,填充记录){ });

所以你可以使用它,例如就像在文档中一样:

User.find({
  name:'Finn'
}).populate('currentSwords', {
  where: {
    color: 'purple'
  },
  limit: 3,
  sort: 'hipness DESC'
}).exec(function (err, usersNamedFinn){

很好很容易。祝你好运!

【讨论】:

  • 不,这不是我要问的问题。也许我问的不够清楚。使用您的示例,您可以获得的是用户的每条记录,您将获得一组颜色为紫色的 currentSwords。但是您也可以获取那些没有 currentSwords 颜色为紫色的用户。只是这些用户的 currentSwords 属性是一个空数组。我想要得到的是在结果集中排除这些用户。
  • 我现在无法尝试,但您是否尝试简单地将currentSwords 添加为user.find 中的条件?
  • 然后我建议将 is 作为一个问题放在 Github 上。 Sails 可以处理很多没有记录的事情,有时 GH 问题是解决问题的唯一方法
  • 如果您能得到答案 - 请在此处发布解决方案(如果可能,请提及我让我知道)以供其他人参考
【解决方案2】:

在谷歌上搜索了几天后,我仍然找不到一个好的解决方案。但是我以不太完美的方式解决了这个问题,但至少它有效。

Book.find({title: {startsWith: 'Star Tek'}}).populate('orders')
.exec(function (err, foundBooks) {
  if (err) return res.negotiate(err);
  var orderIds = [];
  for (var i=0; i<foundBooks.length; i++) {
    for (var j=0; j<foundBooks[i].orders.length; j++) {
      orderIds.push(foundBooks[i].orders[j].id;
    }
  }
  Order.find({id: orderIds}).populate('books').populate( .. some other associations .. )
  .exec(function (err, foundOrders) {
    ...
  });
});

希望有人提出更优雅的方式。

【讨论】:

    【解决方案3】:

    我在尝试返回具有给定角色的用户时遇到了类似的问题。我在我的用户模型上做了一个 find() 并用“学生”角色的标准填充了角色关联。我得到了相同的结果:我的所有用户都返回了,但有些用户的角色关联为空。我用数组过滤器解决了它。

    let students = await User.find({})
      .populate('school')
      .populate('roles', { where: { name: 'student' }});
    sails.log("Full result set:", students);
    filteredStudents = students.filter( element => {
        sails.log(element.roles);
        return element.roles.length != 0;
    });
    console.log("Filtered result set:", filteredStudents);
    

    关键是检查关联数组的长度,看它是否为非空。对于这个特殊的问题(我意识到现在已经超过四年了),这是我的建议(从.... 开始):

    Order.find()
    .populate('books', {title: {startsWith: 'Star Trek'}})
    .exec(function (err, foundOrders) {
      ....
      var filteredOrders = foundOrders.filter( element => element.books.length != 0 );
      // move on with your day using filteredOrders
    });
    

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 2014-05-21
      相关资源
      最近更新 更多