使用mongoose / mongoDB创build/更新对象

互联网充满了处理数组的资源,但通常情况下,对象更适合数据,看起来更有效率。

我想在这样的dynamic字段名称下存储键值对象:

project['en-US'] = { 'nav-back': 'Go back', ... } project['pt-BR'] = { 'nav-back': 'Volte', ... } 

这样做似乎比保留所有语言的数组更有效率,并且必须对其进行过滤以获取给定语言的所有语言条目。

我的问题是:如何插入一个键值对使用mongoose的dynamic名称的对象? 对象是否需要存在,或者我可以创build它,如果它不在一个操作?

我试过这个:

 await Project.update( { _id: projectId }, { $set: { [`${language}.${key}`]: value, }, }); 

但是,无论我是否有一个空对象开始与否,都没有运气: { ok: 0, n: 0, nModified: 0 }

奖金:我应该索引这些对象,以及如何? (我将要更新单个项目)

谢谢!

mongooseschema就是一切。 它描述了你要从数据库中读取/存储的数据。 如果你想在模式中dynamic添加一个新的密钥,这将是很难的。


在这种情况下,我build议使用mongodb-native-driver ,这是对数据操作更加宽容的方式。 所以你可以读取特定格式的数据,并dynamic地添加你的领域。



要恢复我的想法 ,你的dynamic变化应该如何发生:

  • 使用mongodb-native-driver将新密钥插入到数据库数据中
  • 修改代码中的mongoose模式(向其中推入一个新的密钥)
  • 之后使用mongoose来处理数据

不要忘记dynamic更新您的mongoose model否则您将不会在下一次find读取新的密钥。

我解决了这个问题,使用原始的代码片段,但是将{ strict: false }添加到模式中:

 const projectSchema = new Schema({ ...schema... }, { strict: false });