Javascript 不理解mongoose架构数组语法
在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
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对象中获取saybreed
,您可能会得到一个错误或一个奇数值,可能会破坏您的代码。所以Mongoose严格地键入要推送到列表中的对象,除非您使用类似于Mixed
或any
的东西。这里有一个指向文档的链接,可能也有助于解释
如果这不合理,或者我解释得不好,或者回答了错误的问题,请发表评论,我会尽我所能修复它以进行解释
快乐编码:-)只是一个提示,我从mongoose中的文档示例中得到了该语法-var Empty4=newschema({any:[{}]});那么你的问题是,为什么你会有
any:[{}]
或者为什么你不能使用obj=[]
然后开始推呢?@MichaelPlatt后者。为什么我可以使用obj=[]并开始推送