如何在 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
    })
  1. 从mongo 4.2+
  2. 开始支持
  3. $exists 无法使用,因此 $ifnull 使用

playground

您没有有条件地添加新字段。您总是在添加字段,只是具有不同的值。

$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" 
          } }
      }
   }
]