猫鼬地图
Map in Mongoose
我正在尝试在 Mongoose 中创建一个具有映射(对象、关联数组、键值对)的模式,但到目前为止没有成功。
我的架构文档必须是这样的:
{
"_id": ObjectId("..."),
"groups"
{
"groupA":
{
"value1": "...",
"value2": "..."
},
"groupB":
{
"value3": "...",
},
"groupC":
{
"value4": "...",
"value5": "...",
},
...
}
}
groups 是具有 可变键数 的对象。我不知道这些密钥,因为它们将由用户创建。
组中的每个条目都是另一个对象。和以前一样,我不知道键标识符,但我知道值是 String(或布尔值或数字,无关紧要)。
当然,这些键是 Strings.
在 Mongoose 中是否有可能(无论如何构建这样的 schema/model)?
最佳做法是将任何动态数据排除在您的字段名称之外。像这样的用例的典型方法是制作 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
}]
});
你有没有尝试过这样的事情:
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
}]
});
看来有人做了一个插件,万岁!
https://www.npmjs.com/package/mongoose-map
根据自述文件安装和配置后,您就可以{groups:[MongooseMap]}...
5.1 版本开始支持地图 -
http://mongoosejs.com/docs/schematypes.html#maps
我正在尝试在 Mongoose 中创建一个具有映射(对象、关联数组、键值对)的模式,但到目前为止没有成功。
我的架构文档必须是这样的:
{
"_id": ObjectId("..."),
"groups"
{
"groupA":
{
"value1": "...",
"value2": "..."
},
"groupB":
{
"value3": "...",
},
"groupC":
{
"value4": "...",
"value5": "...",
},
...
}
}
groups 是具有 可变键数 的对象。我不知道这些密钥,因为它们将由用户创建。
组中的每个条目都是另一个对象。和以前一样,我不知道键标识符,但我知道值是 String(或布尔值或数字,无关紧要)。
当然,这些键是 Strings.
在 Mongoose 中是否有可能(无论如何构建这样的 schema/model)?
最佳做法是将任何动态数据排除在您的字段名称之外。像这样的用例的典型方法是制作 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
}]
});
你有没有尝试过这样的事情:
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
}]
});
看来有人做了一个插件,万岁!
https://www.npmjs.com/package/mongoose-map
根据自述文件安装和配置后,您就可以{groups:[MongooseMap]}...
5.1 版本开始支持地图 - http://mongoosejs.com/docs/schematypes.html#maps