You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在MongoDB文档存在playerId时生成players对象?

MongoDB聚合:根据playerId存在性生成players字段

原始文档

_id: ObjectId('641316fd596514e63a2121ca'),
teamId: 5,
playerId: ObjectId('64131139596514e63a2121c1')

_id: ObjectId('641316fd596514e63a2121ca'),
teamId: 5,
playerId: ObjectId('64143f7702ede13fea5ff3be')

_id: ObjectId('64143f458b6a6cf54652d3a5'),
teamId: 17,
playerId: ObjectId('64143fa75a97b9a63a260e16')

_id: ObjectId('64143f4f9ba5f2b3cf3030e6'),
teamId: 3

需求说明

需要为文档新增players对象字段,规则如下:

  • 仅当文档本身存在playerId属性时生成该字段
  • players对象需包含原文档的playerId和固定值gender: 'male'
  • 无playerId的文档保持原样,不新增任何字段

期望结果:

_id: ObjectId('641316fd596514e63a2121ca'),
teamId: 5,
players: {
    gender: 'male',
    playerId: ObjectId('64131139596514e63a2121c1')
}

_id: ObjectId('641316fd596514e63a2121ca'),
teamId: 5,
players: {
    gender: 'male',
    playerId: ObjectId('64143f7702ede13fea5ff3be')
}

_id: ObjectId('64143f458b6a6cf54652d3a5'),
teamId: 17,
players: {
    gender: 'male',
    playerId: ObjectId('64143fa75a97b9a63a260e16')
}

_id: ObjectId('64143f4f9ba5f2b3cf3030e6'),
teamId: 3

尝试的错误代码

以下代码逻辑错误,误判了字段存在性(判断players而非playerId),导致无playerId的文档也被添加players字段:

db.collection.aggregate([
  {
    $set: {
      players: {
        $cond: {
          if: {
            $ne: [
              "$players",
              undefined
            ]
          },
          then: {
            $mergeObjects: [
              "$players",
              {
                "gender": "male"
              }
            ]
          },
          else: "$$REMOVE"
        }
      }
    }
  }
])

正确解决方案

使用$exists判断playerId的存在性,在$set中通过$cond控制是否生成players字段:

db.collection.aggregate([
  {
    $set: {
      players: {
        $cond: {
          if: { $exists: ["$playerId", true] },
          then: {
            playerId: "$playerId",
            gender: "male"
          },
          else: "$$REMOVE"
        }
      }
    }
  }
])

逻辑说明

  • { $exists: ["$playerId", true] }:准确判断当前文档是否包含playerId字段
  • 满足条件时,直接构造包含原playerId和固定gender的players对象
  • 不满足条件时,通过$$REMOVE关键字确保不添加players字段,保持原文档结构不变

内容的提问来源于stack exchange,提问作者TheStranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:12:43