在 Mongoose 中定义变体类型

Posted

技术标签:

【中文标题】在 Mongoose 中定义变体类型【英文标题】:Define variant type in Mongoose 【发布时间】:2018-10-09 04:32:00 【问题描述】:

我熟悉 variant 类型的 OCaml。例如,

type foo =
    | Int of int
    | Pair of int * string

我知道如何在 MongoDB 中定义 NumberString,但我的问题是如何在 MongoDB 中定义上述变体类型:

var PostSchema = new mongoose.Schema(
    num:  type: Number ,
    name:  type: String ,
    variant: ???
)

有人知道吗?

编辑 1: 我刚刚找到 this answer 和 this answer。他们使用类或函数来模仿variant。它在前端的 javascript 中运行良好。但是,问题是是否可以将它们放在Schema 中?

【问题讨论】:

【参考方案1】:

您可以使用此代码查看这里的 mongo 文档 https://docs.mongodb.com/manual/reference/operator/query/type/

var PostSchema = new mongoose.Schema(
    num:  type: Number ,
    name:  type: String , 
    variant:  $type: [ Int: “int” , Pair:[“int”, “string” ]  

【讨论】:

对不起,$type selects the documents where the value of the field is an instance of the specified BSON type(s)$type 应该用在查询而不是模式定义中,对吧?【参考方案2】:

我认为 mongoose 希望您使用嵌套类型将属性声明为对象。使用上面的 foo 类型:

var PostSchema = new mongoose.Schema(
   num: [Number],
   name: [String],
   variant: 
      fooInt: [Number]
      fooPair: 
         fooInt: [Number],
         fooString: [String]
      
    
 );

或者 - 你可以使用mixed - 但这对我来说似乎真的很虚张声势。

或者 - 本着 oCaml 的真正精神 - 您可以使用模式(类型+对象)定义该 var:

 ...
 variant: 
    varType: [Number],
    varInfo: [Mixed]
 

varInfo 的结构取决于 varType。这将使您的 mongo 查询更易于管理。

希望这就是您要寻找的方向!仅供参考 - 我发现 this simple post 真的很有帮助。

【讨论】:

以上是关于在 Mongoose 中定义变体类型的主要内容,如果未能解决你的问题,请参考以下文章

mongoose基本增删改查

使用 Node.js、Mongoose 和 Discord.js 的未定义错误 [无法读取未定义的属性]

PostgreSQL 相当于 MongoDB 的 Mongoose?

Mongoose更新嵌套数组

VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数

mongoose的基本操作