如何在 Mongoose 中定义除 _id 之外的其他主键?

Posted

技术标签:

【中文标题】如何在 Mongoose 中定义除 _id 之外的其他主键?【英文标题】:How do I define a different primary key other than _id in Mongoose? 【发布时间】:2020-01-10 12:30:39 【问题描述】:

我想用不是_id 的主键来定义 Mongoose 模式。文档说它只允许在子文档中将架构选项标志 _id 设置为 false。另外,我希望主键是String 而不是ObjectId。这可能吗?

使用二级索引是一种选择,但不是一个很好的选择,因为我希望主键具有正确的名称。我也不想在不需要的时候摆弄两个不同的索引。

这会将documentId 设置为二级索引,但这会使主键无用,因为我只想通过documentId 进行选择,而不是_id 最终被自动设置为。

const DocumentSchema = new Schema(
  documentId:  type: String, index: true 
)

我想做类似的事情

const DocumentSchema = new Schema(
  documentId: String
)

然后告诉它使用documentId 作为主键。

澄清:我特别不想使用_id 作为键,因为它的名称没有帮助,我想使用documentId 作为主键。

【问题讨论】:

【参考方案1】:

您可以在架构阶段手动定义_id 字段,例如:

const DocumentSchema = new Schema(
  _id: String //or number, or (increment) function,
  ...
  other_field: BSON_type,
)

更新 Nestjs

要手动覆盖或定义架构中的 _id 字段,请使用以下示例:

/**
 * extends Document is a Mongoose Document from 'mongoose'
 * and don't forget about Nest Schema decorator
 */
@Schema()
export class Key extends Document  
  @Prop( type: String ) // also can be Number, or Decimal128
  _id: string; // number

  @Prop( type: String, required: true )
  secret: string;

通过@Prop( _id: false )@Prop中的子文档禁用_id

如果您正在寻找带有_id 示例的嵌入式文档数组,您可以might wanna take a look at my other question about it.

并在insert 阶段之前将_id 值添加到您的文档中,或者通过您的函数生成它,或者在schema 部分生成npm 模块,如this。您唯一应该确保的是,您自定义生成的_id 值必须是唯一的。如果他们不这样做,mongo 在插入没有唯一 _id 值的文档期间会返回一个错误。

【讨论】:

我已经有了生成文档 ID 的方法,我只想将它们存储在一个名为 documentId 而不是 _id 的字段中。但是如果这不可能,是否可以将_id定义为String类型呢? @douira 我刚刚将这部分添加到答案中,之前没有看到clarification 部分问题。 可能是我的错,我认为这个问题表明我想将其称为 documentId 而不是 _ id【参考方案2】:
const Schema = new Schema(
  _id: false,
  Id: 
    type: String,
    unique: true,
    index: true,
    required: true,
  ,
);

【讨论】:

【参考方案3】:

在 MongoDB 中,没有主键。

您只需要一个unique: true 索引就可以了。

const DocumentSchema = new Schema(
  _id: false,
  documentId: 
    type: String,
    unique: true,
    required: true
  
)

见https://mongoosejs.com/docs/schematypes.html和https://docs.mongodb.com/manual/core/index-unique/

唯一索引确保索引字段不存储重复 价值观;即强制索引字段的唯一性。默认, MongoDB 在创建过程中会在 _id 字段上创建唯一索引 一个集合。

【讨论】:

哦,所以我只需要定义一个二级索引,make 是唯一的,然后我就有了类似主索引的东西? 是的,正确的。在我的项目中有一堆这样的。话虽如此,这将打破Model.findById。您必须使用Model.findOne( documentId: 'unique_key' ) 查询内容。 @douira 是的,就是这样,但不要忘记,如果您在不带该字段的情况下导入文档,mongo 会返回错误,所以我强烈建议您这样做:@987654323 @。这将在架构期间生成您的 custom_id。 @douira 不,unique: true 为您创建索引。见mongoosejs.com/docs/schematypes.html 和docs.mongodb.com/manual/core/index-unique 我发现所有文档都必须有一个_id 密钥才能让猫鼬工作。如果没有这样的密钥,猫鼬会出错。我现在简单地将_id 字段声明为字符串。【参考方案4】:

索引是最好的方法。事实上,_id 也是一个索引。尝试创建如下索引:

documentSchema.index( 'documentId' : 1 ,  unique: true );

参考:https://docs.mongodb.com/manual/indexes/

【讨论】:

以上是关于如何在 Mongoose 中定义除 _id 之外的其他主键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongoose .save().then() 之外返回一个对象?

如何在下拉列表中获取除隐藏和提交按钮之外的所有表单字段

通过使用 dplyr 添加前缀重命名除 id 列之外的所有列

MongoDB、Mongoose 和 Apollo GraphQL 在文档中定义 _id 类型

如何在使用除 Id 之外的字段获取数据时实现二级缓存

Mongoose 从其他字段创建自定义 _id