Javascript 如何在mongoose模式中设置与已定义类型不同的属性类型?
我在论坛上为用户配置文件设置了Mongoose模式。我想做的是将用户的论坛标题设置为Javascript 如何在mongoose模式中设置与已定义类型不同的属性类型?,javascript,node.js,mongodb,express,mongoose-schema,Javascript,Node.js,Mongodb,Express,Mongoose Schema,我在论坛上为用户配置文件设置了Mongoose模式。我想做的是将用户的论坛标题设置为ObjectID,并引用标题模式。我已经把这个部件安装好了。但是,默认情况下,我希望此字段是一个名为“Noob”的字符串,直到从用户配置文件中设置了标题,然后将此值更改为引用数据库中标题的ObjectID title: { type: mongoose.Schema.Types.ObjectId, ref: 'Title', default: 'Noob' }, 这就是我所拥有的,基本上也是我想要实
ObjectID
,并引用标题模式。我已经把这个部件安装好了。但是,默认情况下,我希望此字段是一个名为“Noob”的字符串,直到从用户配置文件中设置了标题,然后将此值更改为引用数据库中标题的ObjectID
title: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Title',
default: 'Noob'
},
这就是我所拥有的,基本上也是我想要实现的,但是这会引发一个错误,因为我设置的默认值是字符串,而不是
ObjectID
。我不知道如何实现这一点,也不知道我有什么选择。你可以把它变成一个字符串:
title: {
type: String,
ref: 'Title',
default: 'Noob'
},
以后,您仍然可以将其设置为具有ObjectID
外观的字符串
不能两全其美:如果希望字段是ObjectID
类型,则需要保存ObjectID
s。如果您希望能够在其中保存字符串,那么它的类型必须是String
如果title
引用了另一个集合中的ObjectID
,Mongoose在执行查找时仍会将ObjectID
-ish字符串转换为ObjectID
:
Title.find({u id:doc.Title})
如果doc.Title
是一个字符串,则仍将查找ObjectID
。既然您已经指出出于性能原因希望维护强类型ObjectID
,那么您必须使用与默认类型相同的类型。您可以使用所有0的id,例如:
title: {
type: mongoose.Schema.Types.ObjectId,
ref: "Title",
default: 00000000-0000-0000-0000-000000000000
}
然后,您可以检查此项并在稍后的位置显示“Noob”?为什么不将类型设置为
字符串
,并在设置标题后将ObjectId
转换为string
?@brandonscript,以便将其作为字符串开始。那么当用户第一次将其设置为ObjectID时?我是否仍然能够以这种方式保留“ref:'Title'”?不,我的意思是,在运行过程中,将ObjectId转换为stringthis.ObjectId.toString()
Hm。这是否会破坏使用ObjectId作为引用的目的?我使用ObjectID作为数据类型,以便在数据库中存储时使用更少的内存。该应用程序预计将非常大,有100个数千个帐户,因此即使是内存存储大小的最小变化也有点大。默认字符串在用户更改之前只是一个临时度量值,此时我希望将其转换为ObjectDSure,但是您将无法使用“noob”(字符串)作为默认值。使用所有0的ObjectId怎么样?这似乎是我的用例的最佳答案。起初我没有想到这一点,但它肯定能起作用。谢谢