不了解猫鼬模式数组语法

时间:2019-04-25 18:03:17

标签: javascript node.js 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'})

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

1 个答案:

答案 0 :(得分:1)

好的,我会尽力解释这一点。在基本的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真的不会在乎吗?就您而言,您没有做错任何事情,因为您在技术上做了正确的事,将一些对象放入列表中,可以容纳您想要的任何东西。

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

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

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

token = { 
    // YOUR CORRECT TOKEN DATA
}

tokens.push(token);

如果您尝试执行以下操作:

token = { 
    // RANDOM WRONG DATA
}

tokens.push(token);

猫鼬不会善待它,因为您违反了您告诉猫鼬保持情感的限制。如果您开始将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
})

,并且您正在使用将这两个对象组合在一起的列表,如果尝试从breed类型的对象中抓取schema1的话,将会得到错误或可能破坏的奇数值您的代码。因此,除非使用Mixedany之类的类,否则Mongoose严格将要推送到列表中的对象键入。这是指向文档的链接,该链接可能也有助于解释

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

如果这没有意义,或者我讲得不好或回答了错误的问题,请发表评论,我将对其进行修复以尽我所能解释。

快乐编码:-)