【问题标题】:How to insert a doc into mongodb using mongoose and get the generated id?如何使用 mongoose 将文档插入 mongodb 并获取生成的 id?
【发布时间】:2012-05-18 05:29:23
【问题描述】:

我正在使用mongoose来操作mongodb。现在,为了测试,我想通过本机连接将一些数据插入到 mongodb 中。

但问题是插入后如何获取生成的id?

我试过了:

var mongoose = require('mongoose');

mongoose.connect('mongo://localhost/shuzu_test');

var conn = mongoose.connection;

var user = {
    a: 'abc'
};

conn.collection('aaa').insert(user);

console.log('User:');
console.log(user);

但它会打印:

{ a: 'abc' }

没有_id 字段。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    您可以自己生成_id并将其发送到数据库。

    var ObjectID = require('mongodb').ObjectID;
    
    var user = {
      a: 'abc',
      _id: new ObjectID()
    };
    
    conn.collection('aaa').insert(user);
    

    这是我最喜欢的 MongoDB 功能之一。如果您需要创建多个相互链接的对象,则无需在 app 和 db 之间进行多次往返。您可以在应用程序中生成所有 id,然后插入所有内容。

    【讨论】:

    • new ObjectID() 不是需要往返才能获得“可用”ID吗?...否则,不会有极小的碰撞机会吗? ((例如,在 MSSQL 上,NEWID() 符合 RFC4122 ......并确保没有冲突,但它发生在 DB 端。)
    • 我做了一些进一步的研究,遇到了这个 SOQuestion [stackoverflow.com/a/5694803/1327508],它解释了 oid 是如何生成的和 3 种(+1 评论)碰撞场景......我的答案是本质上,“不,你是对的”,因为 oid 是如何生成的。
    • 似乎 IObjectID 已被废弃,“无效的架构配置:_id 架构类型定义无效”
    【解决方案2】:

    如果您使用 .save,那么您将在回调函数中取回 _id。

    const User = require('../models/user.js');    
    
    var user = new User({
      a: 'abc'
    });
    
    user.save(function (err, results) {
      console.log(results._id);
    });
    

    【讨论】:

    • 获取用户不是未定义的
    • 我使用User 作为示例模型。您需要从要导出的任何文件中包含模型。
    • 更新了示例用户模型
    【解决方案3】:

    如果你喜欢使用 Promises:

    const collection = conn.collection('aaa');
    const instance = new collection({ a: 'abc' });
    instance.save()
        .then(result => {
            console.log(result.id);  // this will be the new created ObjectId
        })
        .catch(...)
    

    或者,如果您使用的是 Node.js >= 7.6.0:

    const collection = conn.collection('aaa');
    const instance = new collection({ a: 'abc' });
    try {
        const result = await instance.save();
        console.log(result.id);  // this will be the new created ObjectId
    } catch(...)
    

    【讨论】:

      【解决方案4】:

      您可以使用带有 upsert: true 选项的 Update 方法

      aaa.update({
          a : 'abc'
      }, {
          a : 'abc'
      }, {
          upsert: true
      });
      

      【讨论】:

        猜你喜欢
        • 2013-10-06
        • 2012-07-04
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        相关资源
        最近更新 更多