如何构造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
相关产品推荐
相关产品推荐

