如何使用带有动态键的猫鼬模型模式?
How to use mongoose model schema with dynamic keys?
我在 nodejs 中使用猫鼬,我需要创建一个动态模式模型,
这是我的代码:
schema.add({key : String});
key = "user_name",但在我的数据库中我发现模型将它作为 key
{ key : "Michele" } and not { user_name: "Michele"}
我能做什么?谢谢。
同样的问题schema with variable key
在猫鼬中讨论,
Nope not currently possible. Closest alternative is to use strict: false
or the mixed
schema type.
更新
在 Mongoose 5.1.0 之后,我们可以使用术语 'map',地图是您使用任意键创建嵌套文档的方式
const userSchema = new Schema({
// `socialMediaHandles` is a map whose values are strings. A map's
// keys are always strings. You specify the type of values using `of`.
socialMediaHandles: {
type: Map,
of: String
}
});
const User = mongoose.model('User', userSchema);
// Map { 'github' => 'vkarpov15', 'twitter' => '@code_barbarian' }
console.log(new User({
socialMediaHandles: {
github: 'vkarpov15',
twitter: '@code_barbarian'
}
}).socialMediaHandles);
如果我没理解错的话,您想要 add
动态生成 key
的架构的新列。例如。可能每个用户 post 的 collection,其中 post 的标题是关键。如果用户创建了一个新的 post,它会被添加到他的 collection 中,并将键作为他的 post 的标题。
你最初做的时候
let schema = new Schema({ id: String, ... , key: String })
mongoose 从字面上理解 key
,就像从字面上理解 id
一样。
之所以不能将键动态添加到模式的根,是因为 mongoose 不能保证任何结构。您也可以像其他人建议的那样 strict: false
来制作整个模式 free-form.
但是,如果您不想制作整个架构 free-form,而只是其中的某个部分,您也可以修改您的架构以使用 mixed
let schema = new Schema({ id: String, ... , posts: Schema.Types.Mixed })
现在您可以将所有动态生成的密钥保存在 posts
下,即 free-form。
你也可以用 map:
let schema = new Schema({ id: String, ... , posts: {type: Map, of: String} })
这将允许您在 posts
结构中创建任何 key-value 对。
你可以这样做:
posts: { type: Object }
在 posts 键中,您可以实现任何您想要的键值对
const options = {};
options[key] = String;
schema.add(options);
我在 nodejs 中使用猫鼬,我需要创建一个动态模式模型, 这是我的代码:
schema.add({key : String});
key = "user_name",但在我的数据库中我发现模型将它作为 key
{ key : "Michele" } and not { user_name: "Michele"}
我能做什么?谢谢。
同样的问题schema with variable key
在猫鼬中讨论,
Nope not currently possible. Closest alternative is to use
strict: false
or themixed
schema type.
更新
在 Mongoose 5.1.0 之后,我们可以使用术语 'map',地图是您使用任意键创建嵌套文档的方式
const userSchema = new Schema({
// `socialMediaHandles` is a map whose values are strings. A map's
// keys are always strings. You specify the type of values using `of`.
socialMediaHandles: {
type: Map,
of: String
}
});
const User = mongoose.model('User', userSchema);
// Map { 'github' => 'vkarpov15', 'twitter' => '@code_barbarian' }
console.log(new User({
socialMediaHandles: {
github: 'vkarpov15',
twitter: '@code_barbarian'
}
}).socialMediaHandles);
如果我没理解错的话,您想要 add
动态生成 key
的架构的新列。例如。可能每个用户 post 的 collection,其中 post 的标题是关键。如果用户创建了一个新的 post,它会被添加到他的 collection 中,并将键作为他的 post 的标题。
你最初做的时候
let schema = new Schema({ id: String, ... , key: String })
mongoose 从字面上理解 key
,就像从字面上理解 id
一样。
之所以不能将键动态添加到模式的根,是因为 mongoose 不能保证任何结构。您也可以像其他人建议的那样 strict: false
来制作整个模式 free-form.
但是,如果您不想制作整个架构 free-form,而只是其中的某个部分,您也可以修改您的架构以使用 mixed
let schema = new Schema({ id: String, ... , posts: Schema.Types.Mixed })
现在您可以将所有动态生成的密钥保存在 posts
下,即 free-form。
你也可以用 map:
let schema = new Schema({ id: String, ... , posts: {type: Map, of: String} })
这将允许您在 posts
结构中创建任何 key-value 对。
你可以这样做:
posts: { type: Object }
在 posts 键中,您可以实现任何您想要的键值对
const options = {};
options[key] = String;
schema.add(options);