node.js - Mongoose,按引用属性对结果进行排序

标签 node.js mongodb sorting mongoose

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

假设我有两个集合,Col_ACol_B

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

image for visual reference

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

Github Issue

如果这个问题已经得到解答,我深表歉意。我一直在挖掘文档、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/

相关文章:

javascript - 如何处理来自服务器的空 json 响应

php - 如何使 "LIKE"查询在 MongoDB 中工作?

Python:覆盖两个变量

c++ - "invalid comparator": error when overloading the "<" operator

node.js - 在 arm-linux 上安装 node-serialport 模块

node.js - 无法在 Node 14.4.0 - Windows 10 上安装 SQLITE3

javascript - 如何编写前端(angularjs)到后端(nodejs)?

c# - 自定义 id 字段时 C# 中的 MongoDB 反序列化

tags - 关于 Mongoid/MongoDB 标签树结构的建议

javascript - 如何根据嵌套属性值n javascript对数据进行排序