【问题标题】:Not understanding mongoose schema array syntax不了解猫鼬模式数组语法
【发布时间】:2019-09-15 05:40:04
【问题描述】:

我无法在 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 的文档示例中得到了该语法 - var Empty4 = new Schema({ any: [{}] });
  • 那么你的问题是为什么你会有any: [{}] 或者为什么你不能使用obj = [] 然后就开始推送?
  • @MichaelPlatt 后者。为什么我可以使用 obj = [ ] 并开始推送

标签: javascript node.js mongoose


【解决方案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 不会真的在乎吗?就它而言,您没有做错任何事,因为您在技术上做了正确的事情,将一些对象放入可以包含任何您想要的任何内容的列表中。

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

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

编码愉快:-)

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2020-10-29
    • 1970-01-01
    • 2013-05-08
    • 2023-03-13
    • 2019-10-30
    • 2013-10-11
    • 2021-05-03
    • 2016-08-05
    相关资源
    最近更新 更多