Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不理解mongoose架构数组语法_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 不理解mongoose架构数组语法

Javascript 不理解mongoose架构数组语法,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,在mongoose模式中,我很难理解下面的语法 tokens:[{ token:{ type: 'String', required: true } }] 通常,当我想向数组中添加对象时,我只需推送对象。这包括如果我想将一个具有内部对象的对象推送到所述数组,如下面的示例所示 let obj =[] obj.push({name: 'dirk', age: 24}) obj.push({name: 'chri

在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"]})
token = { 
    // YOUR CORRECT TOKEN DATA
}

tokens.push(token);
JavaScript不会真的在意,对吧?就这一点而言,你没有做错任何事情,因为你在技术上做了正确的事情,把一些对象放入一个列表中,这个列表可以容纳你想要的任何东西

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

tokens:[{
    token:{
        type: 'String',
        required: true
    }
}]
您是在对Mongoose说,它应该期望
tokens
包含具有特定设计的
token
对象的列表。现在,当您想向
令牌
列表添加更多
令牌
对象时,您可以执行以下操作:

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"]})
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
})
您使用的是一个组合了这两个对象的列表,如果您试图从
schema1
type对象中获取say
breed
,您可能会得到一个错误或一个奇数值,可能会破坏您的代码。所以Mongoose严格地键入要推送到列表中的对象,除非您使用类似于
Mixed
any
的东西。这里有一个指向文档的链接,可能也有助于解释

如果这不合理,或者我解释得不好,或者回答了错误的问题,请发表评论,我会尽我所能修复它以进行解释


快乐编码:-)

只是一个提示,我从mongoose中的文档示例中得到了该语法-var Empty4=newschema({any:[{}]});那么你的问题是,为什么你会有
any:[{}]
或者为什么你不能使用
obj=[]
然后开始推呢?@MichaelPlatt后者。为什么我可以使用obj=[]并开始推送