【问题标题】:Mongoose _id affected before saving保存前 Mongoose _id 受影响
【发布时间】:2013-09-16 16:22:22
【问题描述】:
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 } 两次

我尝试过在超时后延迟保存,但它是相同的,它指向设置在new Cat而不是.save()上的_id

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

【问题讨论】:

  • 你查看过Cat.find().exec(function(err,docs){console.log(docs);});提供的ID吗?
  • 我的猜测是它会自动生成 id,这样您就不必往返服务器来找出 id 原来是什么。
  • 是的,这很方便,尤其是用于测试,但一开始我很惊讶。

标签: node.js mongodb mongoose


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 如果两个客户端生成相同的 id 并告诉 mongo 保存它会发生什么? (我知道我知道,UUID 不太可能发生冲突)
  • 第二个只会保存在另一个/第一个之上。它实际上不是 UUID,并且在典型环境中,它不应与生成 _ids 的其他服务器冲突。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2019-03-05
  • 2015-02-09
  • 2014-07-03
  • 2015-02-27
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多