javascript - 不理解 Mongoose 模式数组语法

标签 javascript node.js mongoose

我无法理解 Mongoose 模式中的以下语法。

tokens:[{
        token:{
            type: 'String',
            required: true
        }
    }]

通常,当我想将对象添加到数组时,我只会推送该对象。这包括我是否想将带有内部对象的对象推送到所述数组,如下例所示。

let obj =[]
obj.push({name: 'dirk', age: 24})
obj.push({name: 'chris', age:29, clothes: {shirt: 'black', pants: 'jeans'}, height: '6ft'})

所以我对 Mongoose 感到困惑,为什么我需要这种语法[{}]来使用数组?

最佳答案

好的,我会尽力解释这一点。在基本的 JavaScript 中,由于缺乏更好的词语,数组只是一桶“东西”。这意味着,你可以有这样的东西:

let myList = []
myList.push({name: "John Doe", age: 20})
myList.push({car: {make: "Honda", model: "Accord"}})
myList.push({menu_items: ["item 1", "item 2", "item 3"]})

JavaScript 不会真正关心,对吗?就其而言,您没有做错任何事情,因为从技术上讲您做了正确的事情,将一些对象放入可以容纳您想要的任何内容的列表中。

Mongoose 是一种 ORM(如果您之前没有听说过这个术语,请查看该术语),它要求事情更加严格。请记住,Mongoose 正在尝试将文档从 Mongo 数据库映射到这个“对象”,该“对象”应该是标准的,并且从代码中的任何点都可以读取。因此,在上面列出的问题的示例中:

tokens:[{
    token:{
        type: 'String',
        required: true
    }
}]

您对 Mongoose 说,它应该期望 tokens 包含具有特定设计的 token 对象列表。现在,当您想将更多 token 对象添加到 tokens 列表中时,您可以执行以下操作:

token = { 
    // YOUR CORRECT TOKEN DATA
}

tokens.push(token);

如果您尝试这样做:

token = { 
    // RANDOM WRONG DATA
}

tokens.push(token);

Mongoose 不会友好地接受它,因为你违反了你告诉 Mongoose 保持影响的限制。如果您开始将 any: [{}] 放入其中,您就是在告诉 Mongoose 任何旧对象都可以用于该列表。在我看来,这样做非常危险,因为如果您的列表中有两种类型的对象:

var schema1 = new Schema({
   name:    String,
   age:  { type: Number, min: 18, max: 65 },
   living:  Boolean
})

var schema2 = new Schema({
   name:    String,
   age:  { type: Number, min: 18, max: 65 },
   breed:  Boolean
})

并且您正在使用组合这两个对象的列表,如果您尝试从 schema1 类型对象中获取 breed,您会收到错误或可能会破坏您的代码的奇怪值。因此,Mongoose 严格键入您要推送到列表的对象,除非您使用诸如 Mixedany 之类的内容。这是文档的链接,也可能有助于解释一下

https://mongoosejs.com/docs/schematypes.html#arrays

如果这没有意义或者我解释得不好或者回答了错误的问题,请发表评论,我会尽力修复它并解释。

祝你编码愉快:-)

关于javascript - 不理解 Mongoose 模式数组语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855215/

相关文章:

javascript - Opencart 过滤按钮进入产品列表和类别列表

javascript - Node.js中如何将数据从后端传递到前端

node.js - 使用for循环mongoose批量插入文档

MongoDB/Mongoose 对单个文档的原子读写

node.js - 如何在 mongoose 中组合嵌套 $lookup 3 层?

javascript - 有没有办法在 MVC 中的 View 上使用 ajax 调用来使用新信息刷新页面?

javascript - 复选框 onclick 不会更改通过 jscript 检查

javascript - 将 32 位无符号 "Real"数据类型(拆分为两个 16 位有符号字)转换为 javascript

arrays - 将自定义类型的数组从node-pg和SQL注入(inject)传递给postgres函数

javascript - 加载文件后运行 gulp 任务