我在MongoDB中有这样的数据
{"_id":{"$oid":"5ec4ed0b94996124187b95ce"},
"cid":"245345323",
"dtl":[
{"_id":{"$oid":"5ed5ab655df7930ec424be1e"},
"sid":"test",
"amt":{"$numberInt":"48"},
"Name":"test"},
{"_id":{"$oid":"5ed5ac9f79a75423d4bc0270"},
"sid":"s",
"amt":{"$numberInt":"14"},
"Name":"sfds"},
{"_id":{"$oid":"5ed5ace7d204ab144863ed7a"},
"sid":"wesad",
"amt":{"$numberInt":"6"},
"Name":"2sdad"
},
"updated":{"$date":{"$numberLong":"1589964043787"}},
"__v":{"$numberInt":"6"},
"TotalAmt":{"$numberInt":"68"}}
仅当数组中的amt字段的值大于10时,才需要更新TotalAmt字段。我使用了以下2个选项
PM.findOneAndUpdate(
{
_id: MongoId,
},
[
{
$set: {
//TotalAmt: { $sum: '$dtl.amt' },
/*TotalAmt: {
$cond: {
if: { $gte: ['$dtl.amt', 10] },
then: { $sum: '$dtl.amt' },
else: 0,
},
},*/
},
},
],
{ new: true }
)
它在没有amt> 10条件的情况下正常工作(注释了第一个选项)。但是,如果我添加条件,则无法正常工作。任何帮助,将不胜感激。谢谢
您需要使用$ filter运算符:
PM.findOneAndUpdate(
{
_id: MongoId,
},
[
{
$set: {
TotalAmt: {
$sum: {
$filter: {
input: '$dtl.amt',
cond: { $gte: ['$$this', 10] }
}
}
}
}
}
]
{ new: true }
)
-输出-
{
"_id" : ObjectId("5ec4ed0b94996124187b95ce"),
"cid" : "245345323",
"dtl" : [
{
"_id" : ObjectId("5ed5ab655df7930ec424be1e"),
"sid" : "test",
"amt" : 48,
"Name" : "test"
},
{
"_id" : ObjectId("5ed5ac9f79a75423d4bc0270"),
"sid" : "s",
"amt" : 14,
"Name" : "sfds"
},
{
"_id" : ObjectId("5ed5ace7d204ab144863ed7a"),
"sid" : "wesad",
"amt" : 6,
"Name" : "2sdad"
}
],
"updated" : ISODate("2020-05-20T08:40:43.787Z"),
"__v" : 6,
"TotalAmt" : 62
}
编辑:如果要按其他字段过滤,我们需要添加额外的$map
运算符。
PM.findOneAndUpdate(
{
_id: MongoId,
},
[
{
$set: {
TotalAmt: {
$sum: {
$map:{
input: {
$filter: {
input: '$dtl',
cond: { $eq: ['$$this.Name', 'test'] }
}
},
in:"$$this.amt"
}
}
}
}
}
],
{ new: true }
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句