我想检索最后插入的_id
,使用 mongoose 作为 node.js 的 MongoDB 包装器。我找到了以下教程,但我无法更改任何节点模块,因为该应用程序在公共服务器上运行:
获取“最后插入的 ID”(提示 - 你必须破解 Mongoose)
还有其他想法吗?这是我想做的:
- 插入新用户
- 获取用户
_id
价值 - 根据用户 id 设置新会话
- 重定向到 /
谢谢!
我想检索最后插入的_id
,使用 mongoose 作为 node.js 的 MongoDB 包装器。我找到了以下教程,但我无法更改任何节点模块,因为该应用程序在公共服务器上运行:
获取“最后插入的 ID”(提示 - 你必须破解 Mongoose)
还有其他想法吗?这是我想做的:
_id
价值谢谢!
我正在使用 mongoose 版本 1.2.0,一旦我创建了一个 mongoose 模型的新实例,_id
就已经设置好了。
coffee> u = new User()
[object Object]
coffee> u._id
4dd68fc449aaedd177000001
我还验证了在我调用之后u.save()
仍然_id
是一样的。我通过 MongoHub 验证了这确实是保存到 MongoDB 中的真实 ID。
如果您明确声明
_id: Schema.ObjectId
对于您的模型,则在新建或保存后 ObjectId 将不可用。这可能是一个错误。
如果您要获取子对象的最后插入的 _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);
}
});
使用 MongoDB,如果您没有显式设置文档的_id
值,则客户端驱动程序将自动将其设置为ObjectId值。这与可能在服务器上生成 ID 并需要另一个查询来检索它的数据库不同,例如 SQL Server 的scope_identity()或 MySQL 的last_insert_id()。
这允许您异步插入数据,因为在继续之前不需要等待服务器返回_id
值。
因此,如图所示是彼得的答案,_id
在将文档保存到数据库之前可用。
我只是从传递给回调的文档中获取 id,因为 save 返回保存的文档。
检查以下网址
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);
});