首页 > 解决方案 > 获取和修改数组子文档中的数组子文档

问题描述

我有以下架构,其中有一个数组子文档,其中有另一个数组子文档。如何访问或更新特定奖励的特定获胜者 ID 的声明属性?

const eventSchema = new Schema({
    ...
    rewards: [{
        name: { type: String }
        winners: [{ 
            id: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
            claimed: { type: Bolean }
        }] 
    }]
   ...
});

例如,在下面的文档中,如何在奖励数组中的单个奖励​​中访问获胜者数组中的单个获胜者。

{
    _id: "5f61132da98bac2a98487d79",
    rewards: [{  
            _id: "5f611378a98bac2a98487d7a",
            name: "First Reward"
            winners: [{
                    id: "5f611378a98bac2a98487d77",
                    claimed: false
                }, {
                    id: "5f61132da98bac2a98487d44",
                    claimed: false
                }, {
                    ...
                }]
        }, {
            ....
    }]
}

id: 5f611378a98bac2a98487d77或者具体来说,对于具有奖励元素的获胜者元素,如何将声明状态更新为真实_id: 5f611378a98bac2a98487d7a

标签: mongodbmongoose

解决方案


您可以使用$[<identifier>]来执行此操作。就像是:

Model.updateOne(
  { _id: eventId }, 
  { $set: { "rewards.$[reward].winners.$[winner].claimed": true } },
  { arrayFilters: [ { 'reward._id': rewardId }, { 'winner.id': winnerId } ]}
)

推荐阅读