【问题标题】:MongoDB can't update document because _id is string, not ObjectIdMongoDB 无法更新文档,因为 _id 是字符串,而不是 ObjectId
【发布时间】:2013-01-29 14:42:46
【问题描述】:

我正在做一个 rest api 来在 mongo 数据库和 web 应用程序之间交换数据。这些数据是 json 格式的。

我在更新文档时遇到了麻烦:

cannot change _id of a document.

事实上,在我的 JSON 中,文档的 _id 存储为字符串并反序列化为字符串。而它在 mongo 中存储为 ObjectID。这解释了为什么 mongo 会引发错误。

  • 在 mongo 中:_id: ObjectId('51051fd25b442a5849000001')
  • 在 JSON 中:_id:"51051fd25b442a5849000001"

为避免这种情况,我手动将 _id 属性从 string 转换为 ObjectID。但它看起来很难看,并且会与其他 BSON 类型一起失败。

问:有没有一种简洁的方法可以避免这种情况或进行良好的 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);
            }
        }
    );
});

};

【问题讨论】:

标签: javascript json node.js mongodb bson


【解决方案1】:

因为您无法修改 _id 字段,更好的方法是从您的 map 对象中删除该字段,而不是将其转换为 ObjectId。

所以这个:

delete map._id;

而不是这个:

map._id = new ObjectID.createFromHexString( map._id);

如果您想返回更新后的对象,就像您尝试使用 res.send(map); 一样,您应该使用 findAndModify 而不是 update,这样您就可以访问生成的文档,而不仅仅是发布的内容。

【讨论】:

  • 谢谢。 doc _id 没问题。但我不明白为什么它不能将 _id 反序列化为 ObjectID?如果我在文档中添加其他 bson 类型会发生什么?
  • @t4ncr3d3 本机 mongo 驱动程序包含非常少的类型转换。如果您在这方面寻求更好的支持,我建议您使用 Mongoose,它会为您处理此类转换。
  • @t4ncr3d3 因为_id 不需要是ObjectID,所以它不能只是假设这就是你想要的。
  • @JohnnyHK Mongoose 需要架构设置和许多与保存/检索文档无关的其他工作 - 本机 Mongo 驱动程序应该能够使用 String _id 重新保存 JSON 文档。
  • 到目前为止,Mongoose 在批量插入时也已损坏。
猜你喜欢
  • 2018-06-25
  • 2013-06-22
  • 2020-05-21
  • 2014-07-30
  • 2021-03-27
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多