我有一个集合,其中包含需要展平的余额对象,并且该对象中的字段需要根据集合中的另一个标志进行重命名 -
[
{
"id": "1234",
"documentType": "IV",
"balance": {
"total": 100,
"openBalance": 60,
"paid": 40
}
},
{
"id": "9012",
"documentType": "CM",
"balance": {
"total": 50,
"applied": 0,
"available": 50
}
}
]
如果 documentType === "IV",则 $$ROOT 中的 "balance.paid" 将变为 "totalAmountPaid",而如果是 "CM",则 "balance.applied" 将重命名为 AppliedAmount 和 "balance.available" " 为 availableAmount,所以压平余额对象后最终的集合就变成了 -
[
{
"id": "1234",
"documentType": "IV",
"total": 100,
"openBalance": 60,
"totalAmountPaid": 40
},
{
"id": "9012",
"documentType": "CM",
"total": 50,
"appliedAmount": 0,
"availableAmount": 50
}
]
我尝试像这样使用 $set 和 $cond 但它不起作用,而且我对 MongoDB 命令不是很熟悉 -
db.collection.aggregate([
{
$set: {
$cond: {
if: {
$eq: [
"$documentType",
"IV"
]
},
then: {
"total": "$balance.total",
"openBalance": "$balance.openBalance",
"totalAmountPaid": "$balance.paid",
"balance": "$$REMOVE"
},
else: {
"$total": "$balance.total",
"$availableAmount": "$balance.available",
"$appliedAmount": "$balance.applied",
"balance": "$$REMOVE"
}
}
}
}
])
您在
$set
中面临的问题是因为您试图在一个字段中创建多个字段(新对象),并且您没有提供名称。
由于您要创建多个新字段,因此首先将它们创建为一个字段中的子对象然后用该子对象替换原始文档会更容易。
(此外,在您的
else
子句中,您使用 $total
作为字段名称,而不仅仅是 total
。)
需要改变:
newdoc
并且该表达式包含您之前的代码。
"balance": "$$REMOVE"
,因为无论如何它都会被 newdoc
取代$unset
不需要的 balance
字段和子 newdoc
字段。db.collection.aggregate([
{
$set: {
newdoc: {
$cond: {
if: { $eq: ["$documentType", "IV"] },
then: {
"total": "$balance.total",
"openBalance": "$balance.openBalance",
"totalAmountPaid": "$balance.paid"
},
else: {
"total": "$balance.total",
"availableAmount": "$balance.available",
"appliedAmount": "$balance.applied"
}
}
}
}
},
{ $replaceWith: { $mergeObjects: ["$$ROOT", "$newdoc"] } },
{ $unset: ["balance", "newdoc"] }
])