#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. Я думаю, в этом случае вам нужно использовать агрегацию.