3
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var Cat = mongoose.model('Cat', { name: String });

var kitty = new Cat({ name: 'Zildjian' });
console.log(kitty);
kitty.save();
console.log(kitty);

这个输出:

{ name: 'Zildjian', _id: 523194d562b0455801000001 }两次

我试过在超时后延迟保存,但它是一样的,它指向设置的 _idnew Cat而不是.save()

这是因为mongodb还是mongoose,为什么在实际持久化之前设置_id?

4

1 回答 1

10

大多数 MongoDb 驱动程序将自动生成 ObjectId/_id客户端,包括 Node.js 的本机驱动程序。生成唯一 ID 时会发生少量锁定,因此没有理由不将生成分发给连接的客户端。

Mongoose 需要一个唯一标识符来跟踪和引用对象,因此它会立即创建一个标识符。

在 Node.JS 客户端中,您可以选择将属性设置为forceServerObjectIdtrue控制此行为。

但是,根据文档使用 Mongoose 时,这不能被覆盖:

Mongoose 强制 db 选项 forceServerObjectId 为 false 并且不能被覆盖。Mongoose 将服务器 auto_reconnect 选项默认为 true,该选项可以被覆盖。请参阅 node-mongodb-native 驱动程序实例以了解它理解的选项。

于 2013-09-12T11:02:44.053 回答