MongoDB使用$multiply时报错不支持数组,如何实现数组乘法运算?
报错的核心原因是你传入$multiply运算符的$QTY或$Price字段至少有一个为数组类型,不符合$multiply仅支持数值类型运算的要求,两种解决方式如下:
方案1:不修改原始数据,在聚合逻辑中兼容数组类型
如果你的数组中仅存储单个有效数值,可以通过数组运算符取出目标值后再做乘法,修改后的聚合语句如下:
db.Customer.aggregate([ { "$group": { "_id": "$CustNum", "CustName": {"$first": "$CustName"}, "TransDate": {"$first": "$TransactionDate"}, "ProdDesc": {"$first": "$ProdDesc"}, "Price": {"$first": "$Price"}, "QTY": {"$first": "$QTY"} } }, { "$project": { "Total": { "$multiply": [ // 自动判断字段类型,数组取第一个元素运算,数值直接运算 {"$cond": [{"$isArray": "$QTY"}, {"$first": "$QTY"}, "$QTY"]}, {"$cond": [{"$isArray": "$Price"}, {"$first": "$Price"}, "$Price"]} ] } } } ])
方案2:从根源优化,修改字段为数值类型
更推荐该方案,因为你的业务场景中数量、单价本身就是单值属性,存为数组完全不符合字段设计逻辑,后续做查询、索引、其他聚合运算都会遇到类型兼容问题。
可以用以下批量更新语句修正字段类型:
// 批量修正QTY字段,数组类型改为取第一个元素的数值 db.Customer.updateMany( { QTY: { $type: "array" } }, [{ $set: { QTY: { $first: "$QTY" } } }] ) // 批量修正Price字段,数组类型改为取第一个元素的数值 db.Customer.updateMany( { Price: { $type: "array" } }, [{ $set: { Price: { $first: "$Price" } } }] )
更新完成后你原来的聚合语句就可以直接正常运行,不会再出现同类类型错误。
内容的提问来源于stack exchange,提问作者Biax20
相关产品推荐
相关产品推荐

