MongoDB не может обновить документ, потому что id-строка, а не ObjectId
Я делаю REST api для обмена данными между базой данных mongo и веб-приложением. Эти данные в формате JSON.
у меня проблемы, когда дело доходит до обновления документа:
cannot change _id of a document.
фактически, в моем JSON _id документа хранится как строка и десериализуется как строка. В то время как он хранится как ObjectID в монго. Это объясняет, почему монго вызывает ошибку.
- в монго: _id: ObjectId ('51051fd25b442a5849000001')
- в JSON: _id:"51051fd25b442a5849000001"
чтобы избежать этого, я вручную преобразую свойство _id из строка до ObjectID. Но это кажется уродливым и потерпит неудачу с другими типами BSON.
Q: есть ли чистый способ избежать этого или сделать хорошее преобразование JSON/BSON?
Ниже приведен код, который я использую, чтобы обновить документ. Я использую nodejs с express и mongodb с родным водителем.
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);
}
}
);
});
};
1 ответов
потому что вы не можете изменить _id
поле, лучший подход-просто удалить это поле из вашего map
объект вместо преобразования его в ObjectId.
значит так:
delete map._id;
вместо этого:
map._id = new ObjectID.createFromHexString( map._id);
если вы хотите вернуть обновленный объект, как вы пытаетесь с res.send(map);
, вы должны использовать findAndModify
вместо update
таким образом, у вас есть доступ к результирующему документу, а не только к тому, что было опубликовано.