【问题标题】:Mongoose, Sort Results by Reference AttributesMongoose,按引用属性对结果进行排序
【发布时间】:2017-10-24 04:43:00
【问题描述】:

我会尽量清楚地解决这个问题。

假设我有两个集合,Col_A 和 Col_B。

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

image for visual reference

我想从 Col_A 中查询文档,并按照 Col_B 中的属性 E 进行排序。

如果上面的内容过于广泛,一个实际的例子是像 eBay 这样的网站上的用户和列表。对于此示例,假设 Col_A 是“Listings”,Col_B 是“Users”,属性C是“seller”,属性E是“rating”。

查询:获取所有符合某些条件的列表,按评分最高的卖家排序

这意味着“从 Listings 中获取所有符合某些给定条件的文档,并根据每个 Users 文档的 rating 属性对结果进行排序列表参考。

如何去做这件事?我了解如何通过猫鼬应用基本的排序逻辑,例如:

Listings.find({"attribute A" : "something"}).sort({"some_field": "uhh"}).exec(function(err, docs) { ... });

,但是我可以嵌套在引用文档的属性中并按这些属性排序吗?我是否需要以某种方式在排序参数或其他内容中应用查询?猫鼬有这样的能力吗?我查看了 Mongoose 的填充功能,但我无法使任何工作,显然有一个错误阻止人们实际使用填充的文档进行排序。

Github Issue

如果这个问题已经得到解答,我深表歉意。我一直在挖掘文档、SO 和其他各种站点,但我什么也做不了。提前致谢!

【问题讨论】:

    标签: node.js mongodb sorting mongoose


    【解决方案1】:

    您可以使用 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 不知道它们之间有任何关系。

    【讨论】:

    • 是的,成功了。糟透了,没有更优雅的基于猫鼬的解决方案。哦,还好,还不错。 ;D 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多