如何仅在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
相关产品推荐
相关产品推荐

