如何只显示最新的文档?

Posted

技术标签:

【中文标题】如何只显示最新的文档?【英文标题】:How do I only display the newest document? 【发布时间】:2019-05-28 18:05:18 【问题描述】:

我让猫鼬在 Node.JS/Discord.JS 上搜索一个文档,我将它排序为 date: -1 ,它仍然发送数据库中最旧的文档。 这是我的代码,我做错了什么?

gLog.
  findOne( "GiveawayHostID": name ).
  sort( date: -1).
  exec(function (err, host) 

这是上面使用的架构:

const mongoose = require("mongoose");
const gLogSchema = mongoose.Schema(
  _id: mongoose.Schema.Types.ObjectId,
  GiveawayHost: String,
  GiveawayHostID: String,
  Prize: String,
  WinnerUsername: String,
  WinnerUsernameID: String,
  time: String
);
module.exports = mongoose.model("GiveawayLogs", gLogSchema)

【问题讨论】:

你能展示你的架构吗? 编辑它以显示架构。 如果没有date 字段,您将如何对date 进行排序? 【参考方案1】:

您的架构中似乎没有 date 字段,因此 mongoose 无法按日期排序。您可以按时间排序:

findOne( "GiveawayHostID": name ).
sort( time: -1).
exec(function (err, host) 

但是,这可能不会返回预期的结果,因为您的 time 字段被标记为 String。所以猫鼬会按字母顺序对你的时间进行排序。

要解决此问题,您可以将 time 变量更改为 timestamp 格式。否则,您需要将date 字段添加到您的架构中并关注this example。

【讨论】:

【参考方案2】:

您可以按 _id 字段对其进行排序,这是一种以时间戳开头的 BSON 数据类型,因此您可以按插入时间戳对其进行排序,如果您不这样做,它将始终为您提供最新记录为你创建自定义_id,让mongodb创建一个查看更多信息here

所以你要做的就是:

findOne( "GiveawayHostID": name ).
sort( _id: -1).
exec(function (err, host) 

仅引用文档中的重要部分:

ObjectId 很小,可能是唯一的,生成速度快,并且是有序的。 ObjectId 值由 12 个字节组成,其中前四个字节是 反映 ObjectId 创建的时间戳。具体来说:

4 字节值,表示自 Unix 纪元以来的秒数, 5 字节随机值,并且 3 字节计数器,以随机值开头。

【讨论】:

以上是关于如何只显示最新的文档?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.2 中只显示最新的帖子,而且没有 html <p> 标签?

只显示最新/最新记录

如何从 MySQL 列中的 JSON 文档中获取最新值?

如何在面板/视图中显示第一个/第二个....第 n 个最新节点?

数据库有多个用户的记录 我只要一个用户只显示当前用户最新的记录SQL如何写??

Swift:多个本地通知,但只显示最新的