Как исправить проблему «Обновленное поле стало неопределенным» в запросе MongoDB

#node.js #mongodb #mongodb-query

Вопрос:

В настоящее время я пишу запрос MongoDB для обновления набора запросов в БД, требуется извлечь записи бд, в которых есть mediaOrigin = «Kaltura» и MediaType= «YOUTUBE», затем обновить записи как mediaOrigin= «AWS» и mediaUrl.dataURL и mediaUrl.downloadUrl со значением mediaUrl.originalUrl. Итак, я завершил сценарий для обновления соответствующих запросов, но значение, которое принимают mediaUrl.dataURL и mediaUrl.downloadUrl, не определено. Итак, как я могу это решить, мне нужно заполнить эти два поля значением mediaUrl.originalUrl.

Вот запрос, который я написал,

 try {
db.getCollection('media').find({mediaOrigin: { $eq: 'KALTURA' }, mediaType: {$eq: 'YOUTUBE' }, delete: false
                    
    })
    .forEach(function(media) {
        var youtubeUrl = media.mediaUrl.originalUrl;
                    
        var Url = youtubeUrl;
        
        db.getCollection('media').update(
                            
            {
                _id: media._id
            },
            {
                $set: {
                    'mediaUrl.downloadUrl': Url,
                                            'mediaUrl.dataUrl': Url,
                                             mediaOrigin: 'AWS'
                }
                                    
            }
        );
    });} catch (e) {
print(e);}
 

Так как же я могу это решить?

Здесь я прикрепил пример записи в БД, которую мне нужно обновить.

введите описание изображения здесь

Ответ №1:

Вы прикрепляете .forEach конец .find() метода, чтобы получить результаты из вашей коллекции.

Вам нужно подождать, чтобы получить результаты, прежде чем отправлять результат в foreach.

Так что используйте его вот так:

 const medias = await db.getCollection('media').find({
   mediaOrigin: { $eq: 'KALTURA' },
   mediaType: {$eq: 'YOUTUBE' },
   delete: false 
}).toArray();

medias.forEach(async(media) => {
           var youtubeUrl = media.mediaUrl.originalUrl;
                    
        var Url = youtubeUrl;
        
        await db.getCollection('media').update(
                            
            {
                _id: media._id
            },
            {
                $set: {
                    'mediaUrl.downloadUrl': Url,
                                            'mediaUrl.dataUrl': Url,
                                             mediaOrigin: 'AWS'
                }
                                    
            }
        );
});