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

MongoDB中如何按apy与liquidity的乘积值排序取前10条数据?

解决MongoDB按apy*liquidity乘积排序取前10的问题

问题原因

你当前的写法无法正常运行,主要有两方面原因:一是Mongoose的find().sort()对$expr存在兼容性限制(部分版本不支持该用法);二是代码缺少异步操作的await关键字,未等待查询完成。

方案1:使用聚合管道(推荐)

聚合管道对表达式运算的支持更完善,步骤清晰且兼容性更好:

const data = await models.farm.aggregate([
  // 新增临时字段存储apy与liquidity的乘积
  { $addFields: { product: { $multiply: ["$apy", "$liquidity"] } } },
  // 按乘积降序排序(升序排序请用1)
  { $sort: { product: -1 } },
  // 截取前10条数据
  { $limit: 10 }
]);

如果不需要返回临时的product字段,可追加$project阶段剔除该字段:

const data = await models.farm.aggregate([
  { $addFields: { product: { $multiply: ["$apy", "$liquidity"] } } },
  { $sort: { product: -1 } },
  { $limit: 10 },
  // 排除product字段,仅返回原文档的字段
  { $project: { product: 0 } }
]);

方案2:兼容find()的写法(MongoDB 4.2+)

若坚持使用find(),需确保MongoDB版本≥4.2(该版本开始支持在sort中使用$expr),同时补上await关键字:

const data = await models.farm.find()
  .sort({ $expr: { $multiply: ["$apy", "$liquidity"] } })
  .limit(10);

额外注意事项

如果apy或liquidity是字符串类型,需先转为数值再计算,否则$multiply会报错,修改聚合管道的$addFields阶段即可:

{ $addFields: {
  product: { $multiply: [
    { $toDouble: "$apy" },
    { $toDouble: "$liquidity" }
  ] }
} }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:22:15