(已解决)纠结的问题,Nodejs中mongoDB的sort对日期降序,排序无效果

(已解决)纠结的问题,Nodejs中mongoDB的sort对日期降序,排序无效果

原来是键值写错,写错它也不报错,555

运行环境:wind7 64Bit;MongoDB 2.2.2 64Bit;

我在学习todo例子时,mongoose的排序sort日期无效果。谷歌好久,从2.6.7版本升到最新,改变语法亦无果。最后我以为不是mongoose的问题,直接在MongoDB shell上试验,最终问题定位在MongoDB上。。。。

文本格式如下:

/* 1 / { “content” : “1”, “updated_at” : { "$date" : 1358800741358 }, "_id" : { "$oid" : “50fda765d7a5548023000001” }, "__v" : 0 } / 2 / { “content” : “2”, “updated_at” : { "$date" : 1358800744124 }, "_id" : { "$oid" : “50fda768d7a5548023000002” }, "__v" : 0 } / 3 / { "__v" : 0, "_id" : { "$oid" : “50fdb31692ea378422000001” }, “content” : “3.0”, “updated_at” : { "$date" : 1358891471780 } } / 4 / { "__v" : 0, "_id" : { "$oid" : “50fdb31b92ea378422000002” }, “content” : “5.9”, “updated_at” : { "$date" : 1358803772190 } } / 5 / { “content” : “sort1”, “updated_at” : { "$date" : 1358803755602 }, "_id" : { "$oid" : “50fdb32b92ea378422000003” }, "__v" : 0 } / 6 / { “content” : “sort2”, “updated_at” : { "$date" : 1358803759978 }, "_id" : { "$oid" : “50fdb32f92ea378422000004” }, "__v" : 0 } / 7 / { "__v" : 0, "_id" : { "$oid" : “50fdb35092ea378422000006” }, “content” : “sort3.0”, “updated_at” : { "$date" : 1358891454230 } } / 8 / { “content” : “change1”, “updated_at” : { "$date" : 1358890315521 }, "_id" : { "$oid" : “50ff054b92ea378422000007” }, "__v" : 0 } / 9 */ { “content” : “change2”, “updated_at” : { "$date" : 1358890326185 }, "_id" : { "$oid" : “50ff055692ea378422000008” }, "__v" : 0 }

这个截图更直接看出数据类型: enter image description here

运行MongoDB Shell,用语法排序结果截图: enter image description here

关键语法是:db.todos.find().sort({update_at:-1}),目的是对日期进行降序排列。 日期获取是:node.js里的date.now()。

初步怀疑:mongoDB的sort对长日期无效。(觉得不可能,这个功能太常用了) 但无论如何,都是挺纠结的小白问题,希望有人帮忙解答。。。


5 回复

根据你的描述,你遇到了一个关于在Node.js中使用Mongoose对MongoDB中的日期字段进行降序排序时无效的问题。经过排查,发现问题是由于键名拼写错误导致的。

解决方案

  1. 检查键名拼写:确保你在调用sort方法时使用的键名与数据库中实际存储的键名完全一致。例如,如果你在文档中存储的日期字段名为updated_at,那么在调用sort方法时也应该使用相同的键名。

  2. 示例代码

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义Schema
const todoSchema = new Schema({
    content: String,
    updated_at: { type: Date, default: Date.now },
    __v: { type: Number, select: false }
});

// 创建模型
const Todo = mongoose.model('Todo', todoSchema);

// 查询并按日期降序排序
async function getTodosSortedByDateDescending() {
    try {
        const todos = await Todo.find()
            .sort({ updated_at: -1 }) // 确保键名正确
            .exec();
        
        console.log(todos);
    } catch (error) {
        console.error("Error fetching and sorting todos:", error);
    }
}

// 调用函数
getTodosSortedByDateDescending();

解释

  • Schema定义:定义了一个简单的Todo Schema,包含contentupdated_at__v字段。
  • 创建模型:通过mongoose.model创建了一个名为Todo的模型。
  • 查询并排序:使用find()方法查询所有文档,并通过.sort({ updated_at: -1 })updated_at字段进行降序排序。
  • 执行查询:使用.exec()方法执行查询,并在控制台打印结果。

注意事项

  • 确保你的键名拼写正确,例如updated_at而不是update_at
  • 确保你的MongoDB服务正在运行,并且你的Node.js应用能够连接到MongoDB服务器。
  • 如果你在MongoDB shell中测试排序功能,同样需要使用正确的键名进行排序。

通过以上步骤,你应该能够成功地在Node.js中使用Mongoose对MongoDB中的日期字段进行降序排序。


应该没有这个问题,我用了很久都没发现这个问题

我也用了很久没发现这个问题啊

不好意思,各位,我知道我错在哪里了。当我发现把键值updated_at写成update_at的时候,多么想用头去撞墙算了。。。5555

根据你的描述,问题可能出在键名的拼写错误上。在你的数据示例中,“updated_at”的键名写错了几次,导致排序无法按预期工作。

正确的键名应该是updated_at而不是其他变体。下面是一个简单的示例代码,展示了如何使用Mongoose对日期字段进行降序排序:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义Schema
const todoSchema = new Schema({
    content: String,
    updated_at: { type: Date, default: Date.now },
    __v: { type: Number, select: false }
});

// 创建Model
const Todo = mongoose.model('Todo', todoSchema);

// 查询并排序
Todo.find()
    .sort({ updated_at: -1 }) // 按updated_at字段降序排序
    .exec((err, todos) => {
        if (err) return console.error(err);
        console.log(todos);
    });

确保你的数据库中的键名与查询时使用的键名一致。如果键名写错,MongoDB将不会识别该键,从而导致排序失效。

从你的描述来看,你已经找到了问题所在,即键名拼写错误。希望这段代码示例能够帮助你更好地理解如何正确地进行排序操作。

回到顶部