使用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 }
。
奖金:我应该索引这些对象,以及如何? (我将要更新单个项目)
谢谢!
在mongoose
, schema
就是一切。 它描述了你要从数据库中读取/存储的数据。 如果你想在模式中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 });