我想检索最后插入的_id
,使用mongoose作为node.js的MongoDB包装器。我找到了以下教程,但我无法更改任何节点模块,因为该应用程序在公共服务器上运行:
Getting "Last Inserted ID" (hint - you have to hack Mongoose)
还有其他想法吗?这就是我想要做的事情:
_id
值谢谢!
答案 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);
});