【问题标题】:Mongoose populate sorting not working correctly猫鼬填充排序无法正常工作
【发布时间】:2016-04-05 22:48:41
【问题描述】:

在调试问题时,我发现猫鼬排序无法正常工作。我删除了我们的代码并进行了简单的测试。你可以运行它看看它会失败。

也许有人以前见过?也许我错过了什么?

感谢您的帮助!

var mongoose = require('mongoose');
var assert = require('assert');

mongoose.set('debug', true);
mongoose.connect('mongodb://localhost/test');

var CarSchema = new mongoose.Schema({
    name: String
});
mongoose.model('Car', CarSchema);

var CarsSchema = new mongoose.Schema({
    car: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Car'
    },
    quantity: Number
});

var OrderSchema = new mongoose.Schema({
    suborders: [CarsSchema]
});
mongoose.model('Cars', OrderSchema);

var Car = mongoose.model('Car');
var Cars = mongoose.model('Cars');

Car.create([
    {
        name: 'Tesla'
    },
    {
        name: 'BMW'
    }
], function (err, objs) {

    Cars.create({
        suborders: [
            {
                car: objs[1]._id, //BMW
                quantity: 1
            }, {
                car: objs[0]._id, //Tesla
                quantity: 2
            }
        ]
    }, function (err, order) {

        Cars.findById(order._id)
            .populate({
                path: 'suborders.car',
                options: {
                    sort: '-name'
                }
            }).exec(function (err, cars) {

            assert.equal(cars.suborders[0].car.name, 'Tesla', 'DESC: 0 should be Tesla');
            assert.equal(cars.suborders[1].car.name, 'BMW', 'DESC: 1 should be BMW');

            assert.equal(cars.suborders[0].quantity, 2, 'DESC: Tesla quantity should be 2');
            assert.equal(cars.suborders[1].quantity, 1, 'DESC: BMW quantity should be 1');

        });
    });
});

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    这是一个已确认的猫鼬错误here,并表示不容易修复。 :(

    关键现象是前两个断言通过,然后第三个断言失败。

    也许您可以更改架构设计或搜索“猫鼬子文档排序”之类的内容。 Here 是一个应用 aggregate 的例子。

    【讨论】:

      【解决方案2】:

      很遗憾,您无法对 mongooose/mongodb 中的填充字段进行排序。事实上,这里的人口稠密的田野实际上是存在的,这是由猫鼬创造的。但是它们并不存在于实际的数据库中(因为 mongo 不支持连接),这就是实际应用排序的地方。

      因此,您必须使用 javascript 内置函数 Array.sort(compare) 或任何您喜欢的所需模块手动对结果数组进行排序。

      【讨论】:

        【解决方案3】:

        我认为这可能对您有所帮助,因为在 mongoose 中填充选项 提供正确的排序顺序

          Cars.findById(order._id)
                        .populate({
                            path: 'suborders.car',
                            options: {
                                sort: {name:-1}
                            }
                        }).exec(function (err, cars) {
        });
        

        【讨论】:

        • 太棒了!!我需要做的就是用options 包裹它,然后对它进行排序!
        猜你喜欢
        • 2017-09-22
        • 2019-09-16
        • 2022-08-16
        • 2018-06-18
        • 2019-07-07
        • 2017-01-07
        • 2016-08-17
        • 2017-01-10
        • 1970-01-01
        相关资源
        最近更新 更多