Node + Mongoose:获取最后插入的ID?

时间:2011-05-20 15:35:22

标签: mongodb node.js express mongoose

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

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

还有其他想法吗?这就是我想要做的事情:

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

谢谢!

6 个答案:

答案 0 :(得分:35)

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

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

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

答案 1 :(得分:5)

如果您明确声明

    _id: Schema.ObjectId

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

答案 2 :(得分: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);
                        }

                    });

答案 3 :(得分:0)

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

这允许您异步插入数据,因为在继续之前不需要等待服务器返回_id值。

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

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

检查以下网址

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

您将在给定的网址

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