【问题标题】:Mongoose.js: is it possible to change name of ObjectId?Mongoose.js:是否可以更改 ObjectId 的名称?
【发布时间】:2012-07-03 07:28:12
【问题描述】:

关于mongoose中mongo ObjectId的一些问题

1) ObjectId 字段可以不是命名为 _id 吗?以及如何做到这一点?当我在我的代码中这样做时:

MySchema = new mongoose.Schema({
    id  : mongoose.Schema.ObjectId
});

没有任何改变。

2) 如果我有一个名为 _id 的 objectId 字段,是否可以从请求中返回该字段的另一个名称(例如只是“id” - 在网络响应中发送它);

3) 还有一个问题只是为了理解:为什么 ObjectId _id 字段不能通过“id”属性访问,而不是“_id”?

谢谢,亚历克斯

【问题讨论】:

  • 请参阅此问题以了解您所问的一方面:stackoverflow.com/q/10363513/1259510
  • 谢谢,但似乎虚拟属性并没有解决问题,当我使用 .find 方法时,id 不会返回虚拟,应该是这样吗?而且我相信“所有者:mongoose.Schema.ObjectId” - 是为了关系。并且_id 不能更改。你我感兴趣的是可以用猫鼬在查询结果中用 id 替换 _id。
  • 是的,虚拟属性确实出现在从.find 返回的模型实例上;这就是他们背后的全部想法。每个 MongoDB 文档都必须有一个 _id 属性,但 ObjectId 属性也可以用于其他用途——通常作为对另一个集合中文档的引用。
  • 我有代码:MySchema.virtual('ID').get(function() { return "xxx"; });在查找结果中没有 ID 属性。有什么问题?

标签: node.js mongodb mongoose


【解决方案1】:

“_id”元素是 mongodb 架构的一部分,它保证集合中的每个文档都可以唯一标识。如果您使用分片来允许跨不同机器的唯一标识符,这一点尤其重要。因此,这是一种设计选择,因此无法驾驭它:)

_id的默认值生成如下:

  • 时间戳
  • 机器主机名的哈希
  • 生成进程的pid
  • 增量

但是你可以使用任何你想要的值,只要它是唯一的。

如果您更容易考虑必须存在的东西的 _id,但您真的不在乎 :) 只需让系统自动生成它并使用您自己的标识符。

因此,如果您仍想创建自己的“id”,请执行以下操作:

db.mySchema.ensureIndex({"id": 1}, {"unique" : true})

但请确保它确实是独一无二的,并且不会与您使用的 API 冲突。

2) 在将其作为 Web 响应发送之前,在应用程序端重命名它。

3) 我认为这是因为您使用的 API。也许作者发现返回 id 而不是 _id 更合乎逻辑?老实说从未尝试过猫鼬:)

【讨论】:

  • 非常感谢您的回复。
猜你喜欢
  • 2018-10-12
  • 2016-08-28
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多