我无法理解 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 严格键入您要推送到列表的对象,除非您使用诸如 Mixed
或 any
之类的内容。这是文档的链接,也可能有助于解释一下
https://mongoosejs.com/docs/schematypes.html#arrays
如果这没有意义或者我解释得不好或者回答了错误的问题,请发表评论,我会尽力修复它并解释。
祝你编码愉快:-)
关于javascript - 不理解 Mongoose 模式数组语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855215/