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

Posted

技术标签:

【中文标题】Node + Mongoose:获取最后插入的 ID?【英文标题】:Node + Mongoose: Get last inserted ID? 【发布时间】:2011-08-29 18:37:37 【问题描述】:

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

Getting "Last Inserted ID" (hint - you have to hack Mongoose)

还有其他想法吗?这是我想做的:

插入新用户 获取用户的_id值 根据用户 ID 设置新会话 重定向到 /

谢谢!

【问题讨论】:

【参考方案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 返回保存的文档。

【讨论】:

【参考方案6】:

查看以下网址

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

【讨论】:

这不是 mongoose 解决方案

以上是关于Node + Mongoose:获取最后插入的 ID?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Node.js 和 Mongoose 插入 MongoDB

node.js,mongodb,mongoose,html 我如何插入数据(在 index.html 中)?

Node Js sequelize如何获取最后一个插入id

node.js & mysql - 如何获取最后插入的 ID?

无法使用 mongoose、Node.js 将数据插入到 mongoDB 中的 Document 字段中

为啥 Mongoose 插入 null 作为子文档数组的最后一个元素?