【问题标题】:Two level nested mongoose schema两级嵌套猫鼬模式
【发布时间】:2014-06-22 22:04:54
【问题描述】:

我希望能够在 mongoose 中创建以下结构

{
    "clientId": 9,
    "uniqueNodeId": "REFRESH:NODE:123123123_9_231",
    "parent": null,
    "status": "ACTIVE",
    "templates": [
        {
            "name": "temp",
            "body": "temp",
            "url": "temp",
            "imageUrl": "temp",
            "title": "temp",
            "personaId": 123,
            "status": "ACTIVE",
            "uniqueTemplateId": "REFRESH:TEMPLATE:123123123_9_231"
        }
    ]
}

templates 是一个数组和 json 对象。这样做的正确方法是什么? 我试着做下面的代码。

var folderSchema = mongoose.Schema({
    "clientId": {type: Number, required: true},
    "uniqueNodeId": {type: String, required: true},
    "parent": {type: String, required: true},
    "status": {type: String, required: true},
    "templates": [{
        "name": {type: String, required: true},
        "body": {type: String, required: true},
        "url": {type: String, required: true},
        "imageUrl": {type: String, required: true},
        "title": {type: String, required: true},
        "personaId": {type: String, required: true},
        "status": {type: String, required: true},
        "uniqueTemplateId": {type: String, required: true}
    }]
});

但是我收到以下错误:

TypeError: Undefined type at `paths.clientId`
  Did you try nesting Schemas? You can only nest using refs or arrays.

这是什么意思以及如何纠正它?

【问题讨论】:

  • 如果你在文件中包含了 Number = Schema.Types.Number 删除它,因为它必须引用内置的 JavaScript Number
  • 我没有添加类似的东西

标签: node.js mongodb mongoose schema


【解决方案1】:

您定义它的更好方法是将 Schema 定义分开:

var Schema = mongoose.Schema;

var templateSchema = new Schema({
    "name": {type: String, required: true},
    "body": {type: String, required: true},
    "url": {type: String, required: true},
    "imageUrl": {type: String, required: true},
    "title": {type: String, required: true},
    "personaId": {type: String, required: true},
    "status": {type: String, required: true},
    "uniqueTemplateId": {type: String, required: true}
},{ _id: false});


var folderSchema = new Schema({
    "clientId": {type: Number, required: true},
    "uniqueNodeId": {type: String, required: true},
    "parent": {type: String},
    "status": {type: String, required: true},
    "templates": [ templateSchema ]
});

var Folder = mongoose.model( "Folder", folderSchema );

_id: false 部分是可选的,它是一种告诉 mongoose 不要在数组内的条目上自动生成 _id 字段的方法。这是默认设置,是否需要由您决定。

如果您改变主意并希望拥有一个引用模型而不是嵌入式架构,这也可以实现清晰的分离。如果您想在其他地方重用组件,这也是值得的。

所以在最低限度的使用:

Folder.findOne({},function(err,doc) {
  if (err) {
    console.log(err);
    return;
  }

  console.log(doc);

});

按照标准 Mongoose 命名,将您的数据放在一个名为 folders 的集合中

生产:

{ _id: 5368c2267ea39d89989df13c,
  clientId: 9,
  uniqueNodeId: 'REFRESH:NODE:123123123_9_231',
  parent: null,
  status: 'ACTIVE',
  templates:
   [ { name: 'temp',
       body: 'temp',
       url: 'temp',
       imageUrl: 'temp',
       title: 'temp',
       personaId: '123',
       status: 'ACTIVE',
       uniqueTemplateId: 'REFRESH:TEMPLATE:123123123_9_231' } ] }

【讨论】:

  • 也试过了。给出与问题中提到的相同的错误
  • @nnm 不能说我可以重现相同的内容。以上对我来说没有错误。注意模型定义部分。确保你做同样的事情。顺便说一句,您的数据在您标记为必填String 类型的字段上显示null 值,因此请更改该值或将来出现错误。
  • 我已经编辑了它给出的错误。你现在可以看一下吗?
  • 您所说的“按照标准 Mongoose 命名,将您的数据放置在一个名为文件夹的集合中”是什么意思。我使用以下代码行调用了架构 var folderModel = mongoose.model("refresh_hierarchy", folderDbObject.folderSchema); folderDbobject 是 modules 变量。
  • Mongoose 默认是集合名称的复数形式。如果你想覆盖它并使用特定的集合名称,构造函数还有第三个参数。请参阅documentation
猜你喜欢
  • 2019-03-22
  • 2015-09-21
  • 2021-06-07
  • 1970-01-01
  • 2018-06-23
  • 2019-01-16
  • 2017-01-28
  • 2019-07-20
  • 2017-06-12
相关资源
最近更新 更多