Получение и изменение вложенного документа массива внутри вложенного документа массива

#mongodb #mongoose

#mongodb #мангуст

Вопрос:

У меня есть следующая схема, в которой есть вложенный документ массива, внутри которого есть другой вложенный документ массива. Как мне получить доступ или обновить заявленное свойство определенного идентификатора победителя определенной награды?

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

Например, в приведенном ниже документе показано, как получить доступ к одному победителю из массива winners в одной награде из массива rewards.

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

Или, если быть точным, как обновить заявленный статус до true для элемента winners, имеющего id: 5f611378a98bac2a98487d77 в элементе награды, имеющего _id: 5f611378a98bac2a98487d7a ?

Ответ №1:

Для этого вы можете использовать $[<идентификатор>] . Что-то вроде:

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

Комментарии:

1. Есть ли способ спроецировать это же поле, т.Е. «заявленное», используя select или мне нужно использовать агрегацию?

2. Я думаю, в этом случае вам нужно использовать агрегацию.