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

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

获取“最后插入的ID”(提示 – 你必须破解mongoose)

任何其他的想法? 这是我想要做的:

  • 插入新用户
  • 获取用户的_id
  • 根据用户的ID设置一个新的会话
  • redirect到/

谢谢!

我正在使用mongoose版本1.2.0,一旦我创build一个mongoose模型的新实例, _id已经设置。

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

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

如果你明确声明

  _id: Schema.ObjectId 

对于你的模型,那么ObjectId在新的或保存之后将不可用。 这可能是一个错误。

如果您想要获取最后插入的子对象的 _id,则创build该对象并将其添加到该项目。 下面是使用MongoDB和Mongoose(添加一些模式糖)的NowJS中的一个例子,然后将结果转换为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); } }); 

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

这使您可以asynchronous插入数据,因为在继续之前不需要等待服务器返回_id值。

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

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

检查下面的url

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); });