猫鼬地图

Map in Mongoose

本文关键字:地图      更新时间:2023-09-26

我正在尝试在 Mongoose 中创建一个具有映射(对象、关联数组、键值对)的模式,但到目前为止还没有成功。
我的架构的文档必须是这样的:

{
    "_id": ObjectId("..."),
    "groups"
    {
        "groupA":
        {
            "value1": "...",
            "value2": "..."
        },
        "groupB":
        {
            "value3": "...",
        },
        "groupC":
        {
            "value4": "...",
            "value5": "...",
        },
        ...
    }
}

作为具有可变键数的对象。我提前不知道这些密钥,因为它将由用户创建。
组中的每个条目都是另一个对象。和以前一样,我不知道键标识符,但我知道值是字符串(或布尔值或数字,无关紧要)。
当然,这些键是字符串

在猫鼬中甚至有可能(无论如何都有构建这样的模式/模型)吗?

最佳做法是将任何动态数据排除在字段名称之外。此类用例的典型方法是将groups创建数组,并将组的名称移动到所包含对象的name字段中。 然后,可以使用 Mixed 类型来包含用户定义的值集:

{
    "_id": ObjectId("..."),
    "groups":
    [
        {
            name: "groupA",
            values: {
                "value1": "...",
                "value2": "..."
            }
        },
        {
            name: "groupB",
            values: {
                "value3": "..."
            }
        },
        {
            name: "groupC",
            values: {
                "value4": "...",
                "value5": "..."
            }
        },
        ...
    ]
}

您可以将架构定义为:

var schema = new Schema({
    groups: [{
        name: String,
        values: Schema.Types.Mixed
    }]
});

Map 从版本 5.1 开始受支持 -http://mongoosejs.com/docs/schematypes.html#maps

看起来有人做了一个插件,万岁!

https://www.npmjs.com/package/mongoose-map

根据自述文件安装和配置后,您可以执行{groups:[MongooseMap]}...

你有没有试过这样的事情:

var schema = new mongoose.Schema({
    groups: [mongoose.Schema.Types.Mixed]
});

参考:猫鼬架构类型

编辑,鉴于我在下面的评论,并重新审视我之前的答案,让我们假设所有值都是字符串类型(我已经知道它们可能是任何东西):

var schema = new mongoose.Schema({
    groups:[{
        name: String,
        values:[String]
    }]
});

编辑#2:假设"value1"是一些更有意义的名称的占位符,并假设成员名称的数量是有限的,只要它们不是必需的,那么您可以将它们全部放在您的架构中,因此您应该能够这样做,而不是数组版本:

var schema = new mongoose.Schema({
    groups:[{
        name: String,
        value1: String,
        value2: String,
        value3: String,
        value4: String,
        value5: String
    }]
});