2016-07-17 27 views
1

Ich bin zu $push und $set zur gleichen Zeit mit dem Versuch, $push funktioniert nur gut, wenn es um $set kommt, erzeugt es diesen Fehler:

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

den Code Hier ist
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") 
    }); 

und das ORM-Modell, ich benutze Mungo

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

Jede Hilfe wäre wert ated. Vielen Dank.

Antwort

1

Da die Fehlerzustände wie die Abfrage sieht verwendet gibt keine Dokumente zurück oder gibt keine Dokumente ohne Dateien zurück [].

Ein weiterer Grund für die könnte es Fehler werfen ist, dass Sie $push & $set in dem selben Gebiet sind versucht files und wahrscheinlich in ein Problem laufen ähnlich wie https://jira.mongodb.org/browse/SERVER-1050

IMHO, gibt es keinen Grund zu verwenden das gleiche Feld in $push & $set, stattdessen können Sie einfach

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

zu

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

Diese Antwort ist perfekt danke! – sinusGob

0

Ich habe für mein Projekt Hoffnung ähnliche Art der Abfrage geschrieben konnte u relativ dies zu Ihrem Szenario

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)); 
    }); 

});}; 

Und das funktionierte für mich :)

+0

Vielen Dank für Ihre Antwort, ich habe bereits die Multi hinzugefügt: True, aber immer noch den gleichen Fehler. Ich glaube, mein Set ist '$ set: {'files. $. Name': file.name}', – sinusGob

Verwandte Themen