gpt4 book ai didi

mongodb - MongoDB中具有动态键字段的JSON模式

转载 作者:IT老高 更新时间:2023-10-28 13:09:30 25 4
gpt4 key购买 nike

希望 i18n 支持存储在 mongodb 集合中的对象

目前我们的架构是这样的:

{
_id: "id"
name: "name"
localization: [{
lan: "en-US",
name: "name_in_english"
}, {
lan: "zh-TW",
name: "name_in_traditional_chinese"
}]
}

但我的想法是字段“lan”是唯一的,我可以使用这个字段作为键,所以结构是

{
_id: "id"
name: "name"
localization: {
"en-US": "name_in_english",
"zh-TW": "name_in_traditional_chinese"
}
}

这会更简洁,更容易解析(只需本地化 [语言] 将获得我想要的特定语言的值)。

但问题是:这是在 MongoDB 中存储数据的好习惯吗?以及如何通过json-schema检查?

最佳答案

将值作为键不是一个好习惯。语言代码是值,正如您所说,您无法根据模式验证它们。它使得查询它变得不可能。例如,您无法确定您是否拥有“nl-NL”的语言翻译,因为您无法与键进行比较,也无法轻松地对其进行索引。您应该始终拥有描述性的关键字。

但是,正如您所说,将语言作为键可以更轻松地提取数据,因为您可以通过 ['nl-NL'] (或任何您的语言语法是)。

我会建议一个替代架构:

{
your_id: "id_for_name"
lan: "en-US",
name: "name_in_english"
}
{
your_id: "id_for_name"
lan: "zh-TW",
name: "name_in_traditional_chinese"
}

现在你可以:

  • { your_id: 1, lan: 1 } 上设置索引以便快速查找
  • 单独查询每个翻译并获得该翻译:
    db.so.find( { your_id: "id_for_name", lan: 'en-US' } )
  • 使用同一索引查询每个 id 的所有版本:
    db.so.find( { your_id: "id_for_name"} )
  • 也更容易更新特定语言的翻译:

    db.so.update(
    { your_id: "id_for_name", lan: 'en-US' },
    { $set: { name: "ooga" } }
    )

对于您建议的架构,这两点都不可能。

关于mongodb - MongoDB中具有动态键字段的JSON模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17877619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com