【问题标题】:Node + Mongoose: Get last inserted ID?Node + Mongoose:获取最后插入的 ID?
【发布时间】:2011-08-29 18:37:37
【问题描述】:

我想检索最后插入的_id,使用 mongoose 作为 node.js 的 MongoDB 包装器。我找到了以下教程,但我无法更改任何节点模块,因为该应用程序在公共服务器上运行:

Getting "Last Inserted ID" (hint - you have to hack Mongoose)

还有其他想法吗?这是我想做的:

  • 插入新用户
  • 获取用户的_id
  • 根据用户 ID 设置新会话
  • 重定向到 /

谢谢!

【问题讨论】:

    标签: mongodb node.js express mongoose


    【解决方案1】:

    我使用的是 mongoose 版本 1.2.0,一旦我创建了 mongoose 模型的新实例,_id 就已经设置好了。

    coffee> u = new User()
    [object Object]
    coffee> u._id
    4dd68fc449aaedd177000001
    

    我还验证了在我调用 u.save() 后,_id 保持不变。我通过 MongoHub 验证了这确实是保存到 MongoDB 中的真实 ID。

    【讨论】:

      【解决方案2】:

      如果你明确声明

          _id: Schema.ObjectId
      

      对于您的模型,则 ObjectId 在新建或保存后将不可用。 这可能是一个错误。

      【讨论】:

        【解决方案3】:

        如果您要获取最后插入的 子对象 的 _id,则创建该对象,并将其添加到项目中。这是 NowJS 中使用 MongoDB 和 Mongoose(添加一些模式糖)的示例,然后将结果转换为 JSON 以发送回客户端:

                        var nowRoomID = this.now.room;
                        var Conversation = mongoose.model('Conversation');
                        Conversation.findById(convID, function(error, conversation) {
                            var Blip = mongoose.model('Blip');
                            var createdBlip = new Blip();
                            createdBlip.author= nowUserName;
                            createdBlip.authorid = parsed.authorid;
                            createdBlip.body = revisedText;
                            createdBlip.created_at = new Date();
                            createdBlip.modified_at = new Date();
        
                            conversation.blips.push(createdBlip);
                            parsed._id = createdBlip._id;  //NOTE: ID ACCESSED HERE
                            message = JSON.stringify(parsed);
        
                            conversation.save(function (err) {
                                if (!err) {
                                    console.log('Success - saved a blip onto a conversation!');
                                    nowjs.getGroup(nowRoomID).now.receiveMessage(nowUserName, message);
                                }
        
                            });
        

        【讨论】:

          【解决方案4】:

          对于 MongoDB,如果您没有显式设置文档的 _id 值,那么客户端驱动程序将自动将其设置为 ObjectId 值。这与可能在服务器上生成 ID 并需要另一个查询来检索它的数据库不同,例如 SQL Server 的 scope_identity() 或 MySQL 的 last_insert_id()

          这允许您异步插入数据,因为无需等待服务器返回 _id 值即可继续。

          因此,如 Peter 的回答所示,_id 在文档保存到数据库之前可用。

          【讨论】:

            【解决方案5】:

            我只是从传递给回调的文档中获取 id,因为 save 返回保存的文档。

            【讨论】:

              【解决方案6】:

              查看以下网址

              http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.html

              你会在给定的 url 中找到以下代码

                  var document = {name:"David", title:"About MongoDB"};
                 collection.insert(document, {w: 1}, function(err, records){
                console.log("Record added as "+records[0]._id);
              });
              

              【讨论】:

              • 这不是 mongoose 解决方案
              猜你喜欢
              • 2016-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-27
              • 1970-01-01
              相关资源
              最近更新 更多