簡體   English   中英

Mongo 聚合管道更新或推送

[英]Mongo Aggregation pipeline update or push

我有一個 MongoDB 模型,它由作為對象的成員數組組成。

const guestSchema = new mongoose.Schema({
  salutation: {
    type: String,
  },
  members: [membersSchema],
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'User',
  },
});

成員架構:

const membersSchema = new mongoose.Schema({
  name: String,
  status: {
    type: String, 
    enum: ['regular', 'helper'],
    default: 'regular',
  },
});

我想實現在具有給定 ID 的 documet 存在的情況下進行更新,或者在 ID 不存在的情況下推送到數組。 我使用聚合管道,但是我無法實現將新文檔推送到數組。 為什么我不能像這樣在 else 語句之后使用 push。

const subDocumentToUpsert = { 'name': mem.name, 'status': mem.status, '_id': ObjectId(mem.id)}
      const subDocumentNoID = { 'name': mem.name, 'status': mem.status}


await Guest.findOneAndUpdate(
        { "_id": req.params.id },
        [
          {
            $set: {
              members: {
                $cond: {
                  if: { $in: [subDocumentToUpsert._id, '$members._id'] },
                  then: {
                    $map: {
                      input: '$members',
                      as: 'sub_document',
                      in: {
                        $cond: {
                          if: { $eq: ['$$sub_document._id', subDocumentToUpsert._id] },
                          then: subDocumentToUpsert,
                          else: '$$sub_document',
                        },
                      },
                    },
                  },
                  else: { 
                        $push: {
                          subDocumentNoID
                        }, 
                      },
                  },
                },
              },
            },
          },
      ]);

最好的方法是什么? 謝謝

您可以執行以下操作:

db.collection.update({
 _id: {
  $in: [
    1,
    2
  ]
 }
},
[
{
$set: {
  members: {
    $cond: {
      if: {
        $in: [
          5,
          "$members._id"
        ]
      },
      then: {
        $map: {
          input: "$members",
          as: "sub",
          in: {
            $cond: {
              if: {
                $eq: [
                  "$$sub._id",
                  5
                ]
              },
              then: {
                _id: 5,
                status: "regular_updated",
                name: "Negan_updated"
              },
              else: "$$sub"
            },
            
          },
          
        },
        
      },
      else: {
        $concatArrays: [
          "$members",
          [
            {
              _id: 5,
              status: "regular_upserted",
              name: "Negan_upserted"
            }
          ]
        ]
      }    
    }  
  }
 }
}    
}
],
{
 multi: true
})

解釋:

  1. 檢查子對象中是否存在 _id:5 並通過 $map/$cond 僅更新具有 _id:5 的對象。

  2. 如果沒有 _id:5,則使用 $concatArrays 將新對象添加到數組中。

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM