MongoDB kann nicht update-Dokument, weil _id ist string, nicht ObjectId
Mache ich eine rest-api für den Austausch von Daten zwischen einer mongo-Datenbank und eine web-app. Diese Daten sind in json formatiert.
Ich habe einen Problem, wenn es um die Aktualisierung eines Dokuments:
cannot change _id of a document.
Als eine Angelegenheit von der Tat, in meinem JSON die _id des doc wird als string gespeichert und deserialisiert werden als string. In der Erwägung, dass es gespeichert ist, als ein ObjectID in mongo. Dies erklärt, warum mongo wirft einen Fehler.
- In mongo: _id: ObjectId('51051fd25b442a5849000001')
- In JSON: _id:"51051fd25b442a5849000001"
Um dies zu vermeiden habe ich manuell konvertieren Sie die _id Eigenschaft von string zu einem ObjectID. Aber Es scheint hässlich und fehl mit anderen BSON-Arten.
Q: gibt es eine saubere Art und Weise zu vermeiden oder zu tun ein nettes JSON/BSON-Konvertierung?
Unten ist der code, den ich verwenden, um aktualisieren Sie ein Dokument. Ich bin mit mit nodejs, express und mongodb mit dem nativen Treiber.
exports.updateById = function(req, res) {
var id = req.params.id;
var map = req.body;
map._id = new ObjectID.createFromHexString( map._id); //Manual conversion. How to avoid this???
console.log( 'Updating map: ' + id);
console.log( 'Map: ' + JSON.stringify( map));
db.collection('maps', function(err, collection) {
if(err) throw err;
collection.update(
{'_id': new BSON.ObjectID(id)}, map, {safe:true},
function(err, result) {
if (err) {
console.log('Updating map err: ' + JSON.stringify( err));
res.json( 500, {'message':'An error has occurred while updating the map', 'error': err});
} else {
console.log('Updating succeed');
res.send(map);
}
}
);
});
};
- Siehe auch stackoverflow.com/questions/13031541/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie nicht ändern können
_id
Feld, ein besserer Ansatz ist, entfernen Sie einfach die, das Feld von Ihremmap
- Objekt anstelle der Umwandlung in eine ObjectId.Also diese:
stattdessen:
Wenn Sie zurückkehren möchten das aktualisierte Objekt, wie Sie versuchen mit
res.send(map);
, Sie sollten mitfindAndModify
stattupdate
so haben Sie Zugriff auf die resultierende doc und nicht nur das, was gepostet wurde._id
ist nicht erforderlich, einObjectID
kann es also nicht einfach davon ausgehen, dass das, was Sie wollen.