Массив Moongose с ссылкой на объект и пользовательскими значениями

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