我会尝试尽可能清楚地解决问题。
我们说我有两个系列, Col_A 和 Col_B 。
Col_A 有一个属性属性C ,它通过ObjectID引用我们的其他集合 Col_B 。
我想查询Col_A中的文档,并按 Col_B 中的属性E 排序。
一个实际的例子,如果上述内容过于宽泛,将是eBay等网站上的用户和列表。对于此示例,我们说 Col_A 是&#34; 商家信息&#34;, Col_B 是&#34; < strong>用户&#34;,属性C 是&#34; 卖方&#34;和属性E 是&#34; 的评价&#34;
查询:获取符合某些条件的所有商家信息,按评分最高的卖家排序
这意味着&#34;从列表中获取符合某些给定条件的所有文档,并按每个用户的评级属性对结果进行排序记录列表参考。
怎么会这样做呢?我了解如何通过mongoose应用基本排序逻辑,例如:
Listings.find({"attribute A" : "something"}).sort({"some_field": "uhh"}).exec(function(err, docs) { ... });
,但是我可以嵌套引用文档的属性并按那些排序吗?我是否需要以某种方式在排序参数或其他内容中应用查询? Mongoose能够做到这样吗?我查看了Mongoose的填充功能,但我无法正常工作,显然有一个错误会阻止人们实际使用填充的文档进行排序。
如果已经回答了这个问题我很抱歉。我一直在挖掘文档,SO和其他各种网站,但我无法做任何事情。提前谢谢!
答案 0 :(得分:0)
您可以使用populate方法填充卖家,查询将返回如下数组:
[
{
title: 'Listing #1',
seller: {
name: 'John',
rating: 100
}
}
{
title: 'Listing #2',
seller: {
name: 'John',
rating: 20
}
}
]
然后您可以按如下方式对数据进行排序:
Listings.find({"attribute A" : "something"}).populate('seller').exec(function(err, docs) {
docs.sort(function compare(a, b){
let c = 0;
if (a.seller.rating > b.seller.rating) {
c = 1;
} else if (b.seller.rating > a.seller.rating) {
c = -1;
}
return c;
});
// return or response with docs
});
它可能不是你在看,但我试过:)
Mongo或Mongoose不会执行此类sort
,因为populate
方法会进行2次查询,而Mongo并不知道它们之间存在任何关系。