I'm doing a rest api to exchange data between a mongo database and a web app. These data are json formatted.
I have a trouble when it comes to update a document:
cannot change _id of a document.
As a matter of fact, in my JSON the _id of the doc is stored as a string and deserialized as a string. Whereas it is stored as an ObjectID in mongo. This explains why mongo raises an error.
- In mongo: _id: ObjectId('51051fd25b442a5849000001')
- In JSON: _id:"51051fd25b442a5849000001"
To avoid this I manually convert the _id property from a string to an ObjectID. But It seems ugly and will fail with other BSON types.
Q: Is there a clean way to avoid that or to do a nice JSON/BSON conversion?
Below is the code I use to update a document. I'm using nodejs with express and mongodb with the native driver.
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);
}
}
);
});
};