【问题标题】:Node + Mongoose: Get last inserted ID?Node + Mongoose:获取最后插入的 ID?
【发布时间】:2011-08-29 18:37:37
【问题描述】:
【问题讨论】:
标签:
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 返回保存的文档。