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

MongoDB节点本机驱动程序创建重复文档

束俊材
2023-03-14
> db.people.find()
{ "firstname" : "Fred", "lastname" : "Flintstone", "_id" : ObjectId("52e55737ae49620000fd894e") }
{ "firstname" : "Fred", "lastname" : "Flintstone with a change", "_id" : "52e55737ae49620000fd894e" }
app.post("/contacts", function (req, res) {
  console.log("POST /contacts, req.body: " + JSON.stringify(req.body));

  db.collection("people").save(req.body, function (err, inserted) {
    if (err) {
      throw err;
    } else {
      console.dir("Successfully inserted/updated: " + JSON.stringify(inserted));
      res.send(inserted);
    }
  });
});

以下是运行时日志消息:

POST /contacts, req.body: {"firstname":"Fred","lastname":"Flintstone"}
'Successfully inserted/updated: {"firstname":"Fred","lastname":"Flintstone","_id":"52e55737ae49620000fd894e"}'
POST /contacts, req.body: {"firstname":"Fred","lastname":"Flintstone with a change","_id":"52e55737ae49620000fd894e"}
'Successfully inserted/updated: 1'

为什么我的第二个不更新现有的记录?驱动程序没有将_id值强制转换为objectid吗?

共有1个答案

李振国
2023-03-14

我不知道为什么要创建第二个文档,但为什么不使用update函数(也许与upsert操作符一起使用)?

更新操作的示例:

var query = { '_id': '52e55737ae49620000fd894e' };

db.collection('people').findOne(query, function (err, doc) {
    if (err) throw err;

    if (!doc) {
        return db.close();
    }

    doc['lastname'] = 'Flintstone with a change';

    db.collection('people').update(query, doc, function (err, updated) {
        if (err) throw err;

        console.dir('Successfully updated ' + updated + ' document!');

        return db.close();
    });
});

现在使用upsert操作符:

var query = { '_id': '52e55737ae49620000fd894e' };
var operator = { '$set': { 'lastname': 'Flintstone with a change' } };
var options = { 'upsert': true };

db.collection('people').update(query, operator, options, function (err, upserted) {
    if (err) throw err;

    console.dir('Successfully upserted ' + upserted + ' document!');

    return db.close();
});
 类似资料:
  • 如何在mongo db中创建一个可以公开集合中所有文档的视图?我使用了以下代码: 我正在尝试用管道空列表,但它不工作。你能帮忙吗?

  • 我们正在尝试使用nodejs/mongo原生驱动程序实现下面演示(幻灯片13-18)中概述的策略。 https://www.slideshare.net/mongodb/securing-mongodb-to-serve-an-awsbased-multitenant-securityfanatic-saas-application 总结: 从node.js.创建到mongoDB的连接池 对于租户

  • 在nodejs中,根据每个请求打开mongodb连接,然后在回调中关闭它是一种好做法吗? 有人说,没有必要在每个请求上打开/关闭mongodb连接,因为一旦打开,就可以共享一个连接池。 问题是如何维护和共享该池?猫鼬已经自动做到了吗? 尤其是在mongodb超时或断开连接时,是否需要重新连接? 我在这里发现了相互矛盾的答案:是否根据请求关闭mongodb连接 我读到的几乎所有在线doc nodej

  • 我尝试使用scala 2.11.7在mongodb 3.0.7中保存一个文档,然后进行快速访问:http://mongodb.github.io/mongo-scala-driver/1.0/gett-start/quick-tour/,但是我运行了这个示例,没有发生任何事情。不创建数据库、集合和文档。 控制台: 少了什么?

  • 问题内容: 有克隆和COPYDB在蒙戈外壳可用命令,如何在蒙戈节点本机驱动程序(达到他们的MongoDB)? 那就是我尝试过的: 我发现节点中可用的本机mongodb驱动程序。阅读文档时,我尝试了这段代码(目标数据库名为“ newdb”) 失败并记录以下内容: 问题答案: 您是否尝试过使用?

  • 问题内容: 我们当前的连接配置如下所示: 并且已在当前版本(源代码)中弃用,并将被删除:“此方法无法替代。使用connectTimeout属性控制连接超时。” 我认为重试和连接超时是两回事。有谁知道为什么改变了它以及它有什么(内部)含义? 问题答案: 关于autoConnectRetry的含义有很多困惑。大多数人认为这意味着,如果操作由于IOException而失败,驱动程序将重试该操作,直到ma