我会尝试尽可能清楚地解决问题。
假设我有两个集合,Col_A 和 Col_B。
Col_A 有一个属性,属性 C,它通过 ObjectID 引用我们的其他集合 Col_B。
我想从 Col_A 查询文档,并按 Col_B 中的属性 E 排序。
如果上面的内容太宽泛,那么一个实际的例子是 eBay 等网站上的用户和列表。在此示例中,假设Col_A 为“Listings”,Col_B 为“Users”,属性 C 为“卖家”,属性 E 为“评级”。
查询:获取符合某些条件的所有列表,并按评分最高的卖家排序
这意味着“从列表中获取匹配某些给定条件的所有文档,并根据列表引用的每个用户文档的评级属性对结果进行排序。
如何去做这件事呢?我了解如何通过 Mongoose 应用基本排序逻辑,例如:
Listings.find({"attribute A" : "something"}).sort({"some_field": "uhh"}).exec(function(err, docs) { ... });
,但是我可以嵌套在引用文档的属性中并按这些属性排序吗?我是否需要以某种方式在排序参数或其他参数中应用查询? Mongoose 有这样的能力吗?我查看了 Mongoose 的填充功能,但我无法使任何功能正常工作,而且显然存在一个错误,阻止人们实际使用填充文档进行排序。
如果这个问题已经得到解答,我深表歉意。我一直在挖掘文档、SO 和其他各种网站,但我什么也做不了。提前致谢!
最佳答案
您可以使用 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 不知道它们之间有任何关系。
关于node.js - Mongoose,按引用属性对结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46897735/