MongoDB populate() для динамической загрузки/переноса данных не работает

Я создаю приложение, в котором пользователь добавляет и удаляет объекты (Pic) в массиве («pics») после регистрации, но не уверен, как динамически загружать или заполнять («pics») в userSchema для автоматического рендеринга. Пользователь регистрируется в приложении с изначально пустым массивом ('pics' = ноль) и после этого создает или удаляет эти объекты при входе в систему. Следуя документации, я использовал «ожидание User.find().populate('pics' );" для переноса данных в метод index, но это не сработало.
Кроме того, должен ли я включать ключ 'pics' в метод store, или должно быть достаточно 'pics' userSchema?

const userSchema = new mongoose.Schema({
        name: {
            type: String,
            required: true,
            trim: true
        },
        pics: [
            {                                        
            type: mongoose.Schema.Types.ObjectId,       
            ref: "Pic"
        }
        ],
    });


const picSchema = new mongoose.Schema({
    thumbnail: String,
    description: String,
    dev: {                                        
        type: mongoose.Schema.Types.ObjectId,       
        ref: 'User'
    },        
 },
);
const User = mongoose.model('User', userSchema);
const Pic = mongoose.model('Pic', picSchema)

async index(req, res, next) {
    const users = await User.find().populate('pics');
    res.status(200).json(
     devs
    );
   },

async store(req, res) {     
   try {     
    const { name } = req.body;       
         let user = await User.create({
            name,            
            pics
        })
        // await user.populate('pics').execPopulate();
        res.send({ user })            
    }  
    } catch (error) {
        res.status(400).send(error);
    }             
}, 

person Djony    schedule 18.06.2020    source источник


Ответы (1)


Я работал некоторое время назад с MongoDB и NodeJS. Я думаю, что у вас проблемы с определениями. Также вы можете ознакомиться с документацией https://mongoosejs.com/docs/populate.html.

Вам необходимо определить _id для коллекций (схема).

const userSchema = new mongoose.Schema({
        _id: new mongoose.Types.ObjectId(),
        name: {
            type: String,
            required: true,
            trim: true
        },
        pics: [
            {                                        
            type: mongoose.Schema.Types.ObjectId,       
            ref: "Pic"
        }
        ],
    });


const picSchema = new mongoose.Schema({
    _id: new mongoose.Types.ObjectId(),
    thumbnail: String,
    description: String,
    dev: {                                        
        type: mongoose.Schema.Types.ObjectId,       
        ref: 'User'
    },        
 },
);

Итак, когда вы создаете нового пользователя, _id заполняется (вы можете сгенерировать его или он может быть сгенерирован автоматически) и игнорировать изображения поля. Когда вы создаете изображение, вам нужно прочитать _id пользователя и назначить его как «dev», например:

let pic = new Pic({
    thumbnail: '', description: '',
    dev: yourUser._id
  });

Используя этот способ создания документов, вы можете использовать функцию заполнения.

person Maxi Schvindt    schedule 18.06.2020
comment
Большое спасибо за ваш быстрый отзыв, я полагаю, что многое упустил здесь! Хотя, если я буду следовать именно так, как вы указали, пользователь не сможет зарегистрироваться. Все еще пытаюсь понять это в соответствии с документацией. - person Djony; 19.06.2020
comment
Вы можете попробовать разделить свою проблему, например, попробовать сначала вставить данные в MongoDB и проверить их заполнение. После этого вы можете работать в своей функции для создания пользователя и изображений. Я использую Robo 3T с MongoDB, я могу вставлять, получать и удалять документы, тестировать запросы и т. д. - person Maxi Schvindt; 19.06.2020