LokiJS中$gte/$lte过滤条件失效问题求助
问题:LokiJS查询未生效,始终返回全部数据
我根据用户输入生成查询语句传递给LokiJS处理,但查询似乎未生效,始终返回全部数据。
查询生成逻辑
function prepareQueryFromOptions(options: GetAllTransactionsOptions) { const query: Record<string, any> = { timestamp: { "$gte": options.dateRange.from.getTime(), "$lte": options.dateRange.to.getTime(), }, }; if (options.accounts) { query.accountId = { "$in": options.accounts, }; } if (options.categories) { query.category = { "$in": options.categories, }; } return query; }
查询使用方式
const query: Record<string, any> = prepareQueryFromOptions(options); const transactions: Transaction[] = transactionsCollection.chain().find(query).simplesort('timestamp').data();
失败的测试用例
const AUG_1_2022 = new Date(2022, 7, 1); const AUG_5_2022 = new Date(2022, 7, 5); const AUG_12_2022 = new Date(2022, 7, 12); it('getAllTransactions()', async () => { let txs1 = await transactions.getAllTransactions({ dateRange: { from: AUG_1_2022, to: AUG_12_2022, }, }); expect(txs1.length).toBe(2); // 成功(返回两条交易记录) let txs = await transactions.getAllTransactions({ dateRange: { from: AUG_1_2022, to: AUG_5_2022, }, }); expect(txs.length).toBe(1); // 失败,仍返回两条交易记录 });
问题分析与解决方案
核心问题
大概率是查询条件的类型和存储字段的类型不匹配:
你的查询里用getTime()把Date转成了时间戳数值,但如果交易记录中的timestamp字段存储的是Date对象,LokiJS无法正确比较数值和Date类型,导致查询条件失效,直接返回所有数据。
解决办法
办法一:统一类型为Date对象
修改查询生成逻辑,直接传入Date对象而非时间戳:
function prepareQueryFromOptions(options: GetAllTransactionsOptions) { const query: Record<string, any> = { timestamp: { "$gte": options.dateRange.from, // 直接用Date对象 "$lte": options.dateRange.to, }, }; // 其余逻辑不变... }
办法二:统一类型为时间戳数值
如果你的交易记录timestamp确实存的是数值,那检查测试数据:
- 确认第二条交易的时间戳是否真的大于
AUG_5_2022.getTime(),有可能测试数据的时间设置错误(比如把8月5日之后的交易设成了当天)。 - 可以在查询前打印
query和交易记录的timestamp值,对比确认条件是否匹配。
内容的提问来源于stack exchange,提问作者Aman Desai
相关产品推荐
相关产品推荐

