Sort by the association with populate

2019-02-18 01:07发布

问题:

I have Articles and Comments linked by a one-to-many association (an Article can have many Comments).

I would like to obtain the most commented articles so I proceed like that :

function mostCommentedArticles () {
  var deferred = Q.defer();
  Article.find().populate('comments').sort('comments ASC').exec(deferred.makeNodeResolver());
  return deferred.promise;
}

BUT, I don't obtain the expected result : it doesn't sort at all (by Comments or anything else)

Is there an other way to proceed or is it an issue?

Thanks,

Pierre

回答1:

You pass it in the second parameter of .populate() like this:

.populate('foo', { sort: 'comments ASC' }).exec(...)


回答2:

Neither waterline (0.10.22) or sailsjs (v0.11) currently support this. You would need to process your return variable to reorder the data.

There is a ticket for this at https://github.com/balderdashy/waterline/issues/334

There is a difference between

 function mostCommentedArticles () {
  var deferred = Q.defer();
  Article.find().populate('comments').sort('comments.comment_date ASC').exec(deferred.makeNodeResolver());
  return deferred.promise;
 }

and

function mostCommentedArticles () {
  var deferred = Q.defer();
  Article.find().populate('comments', {sort: 'comment_date ASC'}).exec(deferred.makeNodeResolver());
  return deferred.promise;
 }

The first one should return all the articles and comments with everything sorted by the comment_date. The second one should return all your articles with the attached comments where the comments are sorted by date.

The second one should work using mongodb.



回答3:

This might point you in the right direction:

.populate('foo', { where: [ '1' ]);

You can find more on the where operator here

But be aware that you for now won't be able to easily filter by both a model's native fields, and of populated fields - issue on hithub.