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