【问题标题】:Object type in mongoose猫鼬中的对象类型
【发布时间】:2017-06-20 13:19:31
【问题描述】:

我正在定义一个猫鼬模式,定义如下:

   inventoryDetails: {
        type: Object,
        required: true

    },
    isActive:{
        type:Boolean,
        default:false
    }

我尝试了“对象”类型,我看到我的数据已成功保存。当我将类型更改为数组时,保存失败。

样本数据:

{
    "inventoryDetails" : { 
        "config" : { 
            "count" : { 
                "static" : { "value" : "123" }, 
                "dataSource" : "STATIC" 
            }, 
            "title" : { 
                "static" : { "value" : "tik" }, 
                "dataSource" : "STATIC" 
            } 
        }, 
        "type" : "s-card-with-title-count" 
    } 
}

“对象”类型不是 mongoose 允许的类型之一。但是,它是如何被支持的?

【问题讨论】:

  • 究竟是什么让你失败了?你有没有查看文档。支持对象类型。也支持数组。 mongoosejs.com/docs/schematypes.html
  • 是的,我浏览了文档并支持以下内容。字符串、数字、日期、缓冲区、布尔值、混合、Objectid、数组。哪里提到了对象?没有什么是失败的。只是想知道 mongoose 是否隐式支持 javascript 数据类型

标签: mongodb mongoose mongodb-query


【解决方案1】:

您有两种选择可以在数据库中获取您的Object

1。自己定义

let YourSchema = new Schema({
  inventoryDetails: {
    config: {
      count: {
        static: {
          value: {
            type: Number,
            default: 0
          },
          dataSource: {
            type: String
          }
        }
      }
    },
    myType: {
      type: String
    }
  },
  title: {
    static: {
      value: {
        type: Number,
        default: 0
      },
      dataSource: {
        type: String
      }
    }
  }
})

看看我的真实代码:

let UserSchema = new Schema({
  //...
  statuses: {
    online: {
      type: Boolean,
      default: true
    },
    verified: {
      type: Boolean,
      default: false
    },
    banned: {
      type: Boolean,
      default: false
    }
  },
  //...
})

此选项使您能够定义对象的数据结构。

如果你想要一个灵活的对象数据结构,请看下一个。

2。使用默认的Schema.Types.Mixed 类型

示例取自doc:

let YourSchema = new Schema({
  inventoryDetails: Schema.Types.Mixed
})

let yourSchema = new YourSchema;

yourSchema.inventoryDetails = { any: { thing: 'you want' } }

yourSchema.save()

【讨论】:

  • 非常好的演示。 Schema 作为类定义很容易理解。但是在阅读了 Mongoose 文档之后,我仍然没有收到 SchemaType,这听起来像是架构的架构。还有path.
  • 很好的答案。有没有办法将整个对象标记为“必需”。即“状态”对象本身是必需的?
  • {type: Schema.Types.Mixed, required: true} 而不是第二个示例中的Schema.Types.Mixed
【解决方案2】:

猫鼬 5

一个“万事如意”的 SchemaType。 Mongoose 不会在混合路径上进行任何转换。您可以使用 Schema.Types.Mixed 或通过传递空对象字面量来定义混合路径。以下是等价的。

const Any = new Schema({ any: {} });
const Any = new Schema({ any: Object });
const Any = new Schema({ any: Schema.Types.Mixed });
const Any = new Schema({ any: mongoose.Mixed });

对于您当前的架构,您可以使用下一个示例:

import mongoose from 'mongoose'

const inventorySchema = mongoose.Schema({
  inventoryDetails: {
    type: mongoose.SchemaTypes.Mixed,
    required: true
  },
  isActive:{
    type: Boolean,
    default:false
  }
})

const inventory = await inventorySchema.create({
  inventoryDetails: { 
    config: { 
      count: { 
        static: { value: '123' }, 
        dataSource: 'STATIC' 
      }, 
      title: { 
        static: { value: 'tik' }, 
        dataSource: 'STATIC' 
      } 
    }, 
    type: 's-card-with-title-count' 
  }
})

console.log(inventory)

【讨论】:

    【解决方案3】:

    来自猫鼬文档:https://mongoosejs.com/docs/schematypes.html#what-is-a-schematype

    ...// 任何东西:Schema.Types.Mixed //...

    Mixed 是一种“随心所欲”的模式类型。以下是等价的。

    const Any = new Schema({ any: {} });
    const Any = new Schema({ any: Object });
    const Any = new Schema({ any: Schema.Types.Mixed });
    const Any = new Schema({ any: mongoose.Mixed });
    

    所以,我认为这就是设置 type:Object 起作用的原因。

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2021-05-06
      • 1970-01-01
      相关资源
      最近更新 更多