Mongoose保存前_id受影响

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 } 重复出现

我试过延迟保存操作,但结果相同。这表明_id被设置在new Cat上而不是在.save()上。

这是因为mongodb还是mongoose引起的?为什么在实际持久化之前就设置了_id?


你看过从 Cat.find().exec(function(err,docs){console.log(docs);}); 可用的 ID 吗? - max
我的猜测是它会自动生成ID,这样你就不必往返服务器来查找ID的结果了。 - Todilo
是的,这很方便,特别是用于测试,但一开始让我感到惊讶。 - plus-
1个回答

10

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

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

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

然而,使用Mongoose时无法覆盖此设置,根据docs

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


如果两个客户端生成相同的ID并告诉Mongo保存它,会发生什么?(我知道UUID几乎不可能冲突) - Nepoxx
第二个将覆盖另一个/第一个。它实际上不是UUID,在典型环境中,它不应与生成“_id”的其他服务器发生冲突。 - WiredPrairie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接