我在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"}}
我需要更新TotalAmt字段,只有当数组中的amt字段的值大于10时才会更新。我使用了以下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 }
)
尝试使用 $map 改变 $sum
的输入结构。
PM.findOneAndUpdate(
{
_id: MongoId,
},
[
{
$set: {
TotalAmt: {
$cond: {
if: {$gte: ['$dtl.amt', 10]},
then: {
$sum: {
$map: {
input: '$dtl',
as: "item",
in: "$$item.amt"
}
},
},
else: 0, // 0 or "$TotalAmt" ?
},
},
},
},
],
{new: true}
)