MongoDB字符串转整数求和及10天内到期内容查询问题咨询
MongoDB查询问题解答
问题1:字符串类型字段转整数后求和
使用MongoDB聚合框架的$toInt操作符即可实现类型转换,若要兼容非法字符串、空值等异常场景,可以用$convert操作符设置默认值避免聚合中断。示例代码如下:
// 示例:对sales集合中字符串类型的amount字段求和 db.sales.aggregate([ // 第一步:转换字段类型 { $addFields: { amountInt: { // 基础写法,遇到非数字字符串会报错 // $toInt: "$amount" // 兼容异常值写法 $convert: { input: "$amount", to: "int", onError: 0, // 转换失败返回0 onNull: 0 // 字段为null返回0 } } } }, // 第二步:求和 { $group: { _id: null, totalAmount: { $sum: "$amountInt" } } } ])
注:
$toInt为MongoDB 4.0+版本支持的操作符,更低版本可使用$subtract: [{$toLong: "$amount"}, 0]的方式间接实现字符串转数值。
问题2:过滤符合到期条件的contents数组条目
需要通过聚合框架实现字段类型转换、日期计算、数组过滤三个步骤,示例代码如下:
// 先初始化今天的0点时间,避免时分秒干扰日期匹配 const today = new Date(); today.setHours(0, 0, 0, 0); db.collection.aggregate([ // 拆分contents数组,单个元素转为独立文档 { $unwind: "$contents" }, // 转换字段类型 { $addFields: { // 字符串duration转整数 "contents.durationInt": { $toInt: "$contents.duration" }, // 字符串startDate转日期类型 "contents.startDateDt": { $toDate: "$contents.startDate" } } }, // 匹配符合逻辑的条目 { $match: { $expr: { $and: [ // 条件1:duration>10 { $gt: ["$contents.durationInt", 10] }, // 条件2:startDate + (duration-10)天 = 今天 { $eq: [ { // MongoDB 5.0+版本用$dateAdd $dateAdd: { startDate: "$contents.startDateDt", unit: "day", amount: { $subtract: ["$contents.durationInt", 10] } } // 更低版本兼容写法,直接加毫秒数 // $add: [ // "$contents.startDateDt", // { $multiply: [{ $subtract: ["$contents.durationInt", 10] }, 86400000] } // ] }, today ] } ] } } }, // 可选:将匹配到的条目重新组装为数组返回 { $group: { _id: "$_id", matchedContents: { $push: "$contents" } } } ])
若需要查询未来10天内到期的所有条目,只需将日期匹配的
$eq替换为$gte+$lte的区间判断即可。
内容的提问来源于stack exchange,提问作者SirrMaxi
相关产品推荐
相关产品推荐

