当前位置: 首页 > 知识库问答 >
问题:

MongoDB无法更新文档,因为_id是字符串,而不是ObjectId

雷曜灿
2023-03-14

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

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

cannot change _id of a document.

事实上,在我的JSON中,doc的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);
            }
        }
    );
});

};

共有1个答案

鞠鸿雪
2023-03-14

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

所以这个:

delete map._id;

而不是这样:

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

如果您希望像使用res.send(map);那样返回更新后的对象,则应该使用findandmodify而不是update,这样您就可以访问生成的文档,而不仅仅是发布的文档。

 类似资料:
  • 问题内容: 我正在使用猫鼬(节点),输出id而不是_id的最佳方法是什么? 问题答案: 我在执行此操作的模型上创建toClient()方法。这也是重命名/删除您不想发送给客户端的其他属性的好地方:

  • 我在MongoDB中使用Java驱动程序。我有一个集合中的文档id列表。我想在每个文档中更新一个字段,该文档的“\u id”等于列表中的一个文档id。在下面的示例中,我尝试了以下方法: 我的目的是用\u id=123、\u id=456和\u id=789更新文档,将其“field”属性设置为59。 我这样做对吗?

  • 我有一个对象,它的父类可以设置_id字段,也可以不设置。 在这种情况下,没有设置_id字段,我将一个对象传递给 收集insertOne(对象) 通常情况下,mongo会为未指定的_id生成一个ObjectId(),但由于某种原因,每当_id由父类指定且未设置时,它会生成一个id,bug会将id保存为数据库中的字符串,而不是ObjectId。 我所经历的 {“name”:“name”} 预期: {“

  • 问题内容: 在.NET Framework 的参考中,使用type 声明请求类型。 在RFC 2616 中,声明了所有HTTP请求方法(例如POST,GET,PUT,DELETE …)。 .NET 和类中也存在类似的行为。 Java在方法上有类似的方法。 这些语言设计者为什么不考虑为这些HTTP方法实现枚举? 你有好主意吗? 问题答案: RFC 2616 链接的第一句话(添加了重点): HTTP

  • 当我试图根据下面的itemId更新MongoDB集合中的文档时,它工作得很好,并且能够从mongo ops日志中看到查询被转换为“itemIds中的_id”。 当我升级到spring-data-mongodb-2.1.5.release时,我在mongo日志中看到的查询是“item_id in itemids”。由于item_id不是一个字段,集合中也没有该字段的索引,因此查询需要花费很长时间才能

  • 编程相对较新。我想读取一个URL,修改文本字符串,然后将其写入以行分隔的csv文本文件。 阅读 但我无法将相同的字符串写入文件——它只会变成一行(请参阅下面的循环,尝试1) 我想我正在寻找一种方法,在FileWriter或BufferedWriter循环中,将字符串finalDataA转换为数组字符串(即包括字符串后缀[0]),但我还没有找到这样一种方法,不会给出类型“不能”的错误将String转