You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构造findOne()查询以返回基于dateViewed的最新条目?

问题描述

我有如下存储的数据集合:

{
"_id":"62d530c4684721ff4e5325a3",
"clientsNumber":"0705087333",
"dateViewed":"18th July 2022, 1:06:56 PM"
}

{
"_id":"62d530c4684721ff4e5325a3",
"clientsNumber":"0705087444",
"dateViewed":"18th July 2022, 2:36:56 PM"
}

{
"_id":"62d530c4684721ff4e5325a3",
"clientsNumber":"0705087555",
"dateViewed":"18th July 2022, 3:06:56 PM"
}

我需要使用findOne()返回最新的条目,即示例中的:

{
"_id":"62d530c4684721ff4e5325a3",
"clientsNumber":"0705087555",
"dateViewed":"18th July 2022, 3:06:56 PM"
}

尝试了以下代码但未得到预期结果:

client.db("Billboard_adverts").collection("adverts").findOne({clientsNumber: clientsNumber}).sort({ dateViewed: -1 });

请问该如何构造findOne()查询代码,以基于dateViewed返回最新条目?

解决方案

正确的findOne调用方式

你的代码错误在于:findOne()执行后直接返回单个文档(或Promise),无法链式调用sort()方法。正确的做法是将排序规则作为findOne的第二个参数(选项参数)传入:

client.db("Billboard_adverts").collection("adverts").findOne(
  { clientsNumber: clientsNumber },
  { sort: { dateViewed: -1 } }
);

注意事项:日期字符串的排序风险

当前你的dateViewed字段存储为字符串类型,虽然示例中的排序能正常工作,但如果遇到类似"10:06:56 PM"和"2:36:56 PM"的情况,字符串字典序排序会导致"10..."排在"2..."前面,这不符合实际时间顺序。

建议优化方案:将dateViewed字段修改为MongoDB的Date类型存储,这样排序会基于实际时间戳,结果更准确。插入文档时可以这样处理:

// 插入时转换为Date类型
const dateViewed = new Date("18th July 2022, 3:06:56 PM");
// 之后查询排序逻辑不变,且结果更可靠

替代方案:使用find+sort+limit

如果更习惯链式调用,也可以用find()配合sort()和limit(1),再通过next()获取结果:

client.db("Billboard_adverts").collection("adverts")
  .find({ clientsNumber: clientsNumber })
  .sort({ dateViewed: -1 })
  .limit(1)
  .next();

内容的提问来源于stack exchange,提问作者SirBT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:24:32