如何在 MongoDB 中有条件地添加新字段?
How to add new field conditionally in MongoDB?
我有一个 aggregation pipeline
,我想根据特定条件在其中添加新字段。我的流水线是这样的
[
{ // match stage
$or:[
{
$and: [
{placement: {'$nin': [-1,-2]}},
{contract_proposal_metadata : {$exists: true}}
]
},
{
risk_info_request_metadata: {$exists: true}
}
]
}
]
现在我想添加一个新字段 record_type
,条件是如果 contract_proposal_metadata
存在,则记录类型将为 'renewal',如果 risk_info_request_metadata
存在,则record_type
将是 request
.
我怎样才能做到这一点?
您需要使用聚合更新
db.collection.update({
placement: { //Your match goes here
"$nin": [
-1,
-2
]
},
},
[
{
$set: {
status: {
$switch: {
branches: [
{ //update condition goes here
case: {
$ifNull: [
"$contract_proposal_metadata",
false
]
},
then: "renewal"
},
{
case: {
$ifNull: [
"$risk_info_request_metadata",
false
]
},
then: "request"
},
],
default: ""
}
}
}
}
],
{
multi: true
})
- 从mongo 4.2+
开始支持
$exists
无法使用,因此 $ifnull
使用
您没有有条件地添加新字段。您总是在添加字段,只是具有不同的值。
有 $cond 运算符,其中 returns 2 个值中的 1 个取决于第一个参数中的条件。
您已经知道 $match
阶段的 $exist
,聚合表达式中使用的等效运算符是 $type
[
{ // match stage
.....
},
{ // adding the field
$addFields: {
record_type: { $cond: {
if: { $eq: [ { $type: "$contract_proposal_metadata" }, "missing" ] },
then: "request",
else: "renewal"
} }
}
}
]
我有一个 aggregation pipeline
,我想根据特定条件在其中添加新字段。我的流水线是这样的
[
{ // match stage
$or:[
{
$and: [
{placement: {'$nin': [-1,-2]}},
{contract_proposal_metadata : {$exists: true}}
]
},
{
risk_info_request_metadata: {$exists: true}
}
]
}
]
现在我想添加一个新字段 record_type
,条件是如果 contract_proposal_metadata
存在,则记录类型将为 'renewal',如果 risk_info_request_metadata
存在,则record_type
将是 request
.
我怎样才能做到这一点?
您需要使用聚合更新
db.collection.update({
placement: { //Your match goes here
"$nin": [
-1,
-2
]
},
},
[
{
$set: {
status: {
$switch: {
branches: [
{ //update condition goes here
case: {
$ifNull: [
"$contract_proposal_metadata",
false
]
},
then: "renewal"
},
{
case: {
$ifNull: [
"$risk_info_request_metadata",
false
]
},
then: "request"
},
],
default: ""
}
}
}
}
],
{
multi: true
})
- 从mongo 4.2+ 开始支持
$exists
无法使用,因此$ifnull
使用
您没有有条件地添加新字段。您总是在添加字段,只是具有不同的值。
有 $cond 运算符,其中 returns 2 个值中的 1 个取决于第一个参数中的条件。
您已经知道 $match
阶段的 $exist
,聚合表达式中使用的等效运算符是 $type
[
{ // match stage
.....
},
{ // adding the field
$addFields: {
record_type: { $cond: {
if: { $eq: [ { $type: "$contract_proposal_metadata" }, "missing" ] },
then: "request",
else: "renewal"
} }
}
}
]