Mongoose,按引用属性排序结果

时间:2017-10-23 20:13:48

标签: node.js mongodb sorting mongoose

我会尝试尽可能清楚地解决问题。

我们说我有两个系列, Col_A Col_B

Col_A 有一个属性属性C ,它通过ObjectID引用我们的其他集合 Col_B

image for visual reference

我想查询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的填充功能,但我无法正常工作,显然有一个错误会阻止人们实际使用填充的文档进行排序。

Github Issue

如果已经回答了这个问题我很抱歉。我一直在挖掘文档,SO和其他各种网站,但我无法做任何事情。提前谢谢!

1 个答案:

答案 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并不知道它们之间存在任何关系。