如何在 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 列之外的所有列