2016-07-17 2 views
1

Я пытаюсь $push и $set в то же время, $push работает просто отлично, когда дело доходит до $set, он генерирует сообщение об ошибке:

MongoError: The positional operator did not find the match needed from the query. Unexpanded update: files.$.name

Вот код

Course.update(
    { 
     _id: req.body.courseId, 
     'files.fileUrl': { $ne: url } 
    },{ 
     $push: { files: { fileUrl: url } }, 
     $set: {'files.$.name': file.name}, 
    }, function(err, count) { 
     if (err) return next(err); 
     console.log("Successfully saved") 
    }); 

и модель ORM, я использую mongoose

var CourseSchema = new Schema({ 
    files: [{ 
     fileUrl: String, 
     name: { type: String, default: 'File name'} 
    }] 
}); 

Любая помощь была бы признательна редактор Благодарю.

ответ

1

Как ошибочные состояния выглядит запрос используется не возвращает никаких документов или документов, не имеющих файлов [].

не

Еще одна причина, по которой он может бросать ошибку в том, что вы пытаетесь $push & $set в том же поле files и, вероятно, работает в проблему, подобной https://jira.mongodb.org/browse/SERVER-1050

ИМХО, нет никаких оснований для использования то же поле в $push & $set, вместо этого вы можете просто изменить

$push: { files: { fileUrl: url } }, 
$set: {'files.$.name': file.name}, 

в

$push: { files: { fileUrl: url, name: file.name } }, 
+0

Этот ответ безупречен! – sinusGob

0

Я написал подобного рода запроса для моего проекта надежды у мог родственница это к вашему сценарию

exports.candidateRating = function(req, res) { 
console.log(req.query); 
console.log(req.body.RoundWiseRatings); 
Profiles.update({ 
    "name": req.query.name 
}, { 
    $set: { 
     "ratings": req.body.ratings, 
    }, 
    $push: { 
     "RoundWiseRatings": req.body.RoundWiseRatings 
    } 
}, { 
    multi: true 
}, function(error, profiles) { 

    if (error) { 

    } 
    return Profiles.find({ 
     name: req.query.name 
    }, function(err, profiless) { 
     console.log(profiless); 
     if (err) { 
      return handleError(res, err); 
     } 
     return res.status(200).json(fnStruncturedData(profiless[0].RoundWiseRatings)); 
    }); 

});}; 

И это работало для меня :)

+0

Спасибо за ваш ответ, я уже добавил multi: true, но все равно получаю ту же ошибку. Я считаю, что мой набор '$ set: {'files. $. Name': file.name}', – sinusGob

Смежные вопросы