地图在mongoose
我试图在Mongoose中创build一个具有映射(对象,关联数组,键值对)的模式,但目前为止没有成功。
我的模式文件必须是这样的:
{ "_id": ObjectId("..."), "groups" { "groupA": { "value1": "...", "value2": "..." }, "groupB": { "value3": "...", }, "groupC": { "value4": "...", "value5": "...", }, ... } }
组作为具有可变数目的键的对象。 提前不知道这些密钥,因为它将由用户创build。
组中的每个条目都是另一个对象。 和以前一样,我不知道关键标识符,但是我知道这些值是String (或者Boolean,或者Number,没关系)。
当然,这些键是string 。
在Mongoose中甚至有可能(是否有build立这样的模式/模型)?
最佳做法是将任何dynamic数据保留在字段名称之外。 像这样的用例的典型方法是将groups
作为一个数组,并将组的name
移动到所包含对象的name
字段中。 然后,您可以使用“ Mixed
types来包含用户定义的一组值:
{ "_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 }] });
看起来像有人做了一个插件,万岁!
https://www.npmjs.com/package/mongoose-map
一旦你根据自述进行安装和configuration,你可以做{groups:[MongooseMap]}...
你有没有尝试过这样的事情:
var schema = new mongoose.Schema({ groups: [mongoose.Schema.Types.Mixed] });
参考: mongoose模式types
编辑,给我下面的评论,并在我之前的答案,riffing,让我们假设所有的值是stringtypes(我已经明白,他们可能是任何东西):
var schema = new mongoose.Schema({ groups:[{ name: String, values:[String] }] });
编辑#2:假设“value1”是一个更有意义的名称的占位符,并假定成员名称的数量是有限的,只要它们不是必需的,那么你可以把它们全部放在你的模式中,而不是arrays版本,你应该可以这样做:
var schema = new mongoose.Schema({ groups:[{ name: String, value1: String, value2: String, value3: String, value4: String, value5: String }] });