#arrays #mongodb #refs
#массивы #mongodb #ссылки
Вопрос:
Я пытаюсь создать схему учетной записи со свойством ключа достижений в виде массива идентификаторов объектов ссылки и других свойств, но не могу понять, как это сделать. При отправке данных передается только идентификатор объекта ref без других свойств.
Есть ли лучший способ, чем просто хранить в одном массиве ссылки на объекты, а в другом — другие свойства?
achievements: [{achievement: {type: Schema.Types.ObjectId, ref: 'Achievement'}}, {
claimed: {
type: Boolean,
default: false
}
}, {
isDone:
{type: Boolean, default: false}
}, {
current:
{type: Number, default: 0}
}],
AccountSchema.statics.addAllExistingAchievements = (account: any) => {
return new Promise((resolve, reject) => {
return Achievement.find().exec().then((achievements: any) => {
achievements.map((achievement: any, index: number) => {
account.achievements.push({achievement: achievement}, {claimed: false}, {isDone: false}, {current: 0})
if (achievements.length - 1 === index) {
account.save();
}
})
resolve({success: true});
}).catch((e: any) => reject(e));
}
)
}
Комментарии:
1. почему вы используете
ref
его в своей модели? MongoDB имеет оператор агрегации $lookup, подобный соединению. У Mongoose есть альтернатива под названием populate() , которая позволяет создаватьref
документы в других коллекциях. Заполнение — это процесс автоматической замены указанных путей в документе документами из других коллекций. но вы используете ref для модели с самим собой2. @MohammadYaserAhmadi Как вы можете видеть, я использую ссылки. Я попытался создать массив с ссылкой и дополнительными данными, чтобы предотвратить создание двух массивов, которые будут объединены во внешнем интерфейсе, но не имею ни малейшего понятия, как это сделать.
3. ваша проблема решена? если ваш ответ отрицательный, пожалуйста, добавьте контроллер, не нужно
statics.addAllExistingAchievements
функционировать, если вы считаете, что это необходимо, можете ли вы это объяснить?4. Я сделал обходной путь для двух полей, одно из которых содержит ссылку, а другое — данные пользователя (чтобы проверить, выполнил ли он достижение, получил приз и так далее). Функция
statics.addAllExistingAchievements
должна быть моей проблемой. Поскольку это часть пути создания учетной записи, и если учетная запись пользователя не получит возможных достижений, которые он может иметь, в игре будет ошибка. Я создал коллекцию достижений для хранения всех достижений в игре с указанием дел, описаний и наград, и это также хранится в учетной записи пользователя как ссылка, но игре нужно знать, получил ли пользователь призы, и если нет, то какой прогресс.