如何使用带有动态键的猫鼬模型模式?

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);