gpt4 book ai didi

javascript - 当翻译在另一个集合中时,如何在 MongoDB 上处理 i18n(带回退)?

转载 作者:行者123 更新时间:2023-11-29 15:07:21 25 4
gpt4 key购买 nike

鉴于这些摘录集合:

译文集

[
{
"_id": "id01_name",
"text": "Item's Name"
},
{
"_id": "id01_desc",
"text": "Item's lore description"
},
{
"_id": "sk_id",
"text": "Item's skill description"
},

]

元素收藏

[
{
"_id": "id01",
"name": "id01_name",
"lore_description": "id01_desc",
"skill": {
"description": "sk_id01",
}
}
]

问题:

仅使用 mongodb 驱动程序(没有 Mongo ODM,如 mongoose、iridium 等),当翻译在另一个集合中时,在 MongoDB 上进行 (i18n) 国际化(带回退)的最佳方法是什么?


MongoDB 的聚合方法

目前,我正在使用 aggregate$lookup 来执行此类查询。

db.artifact.aggregate([
{
$lookup: { // get the name's data from the english translation
from: "text_en",
localField: "name",
foreignField: "_id",
as: "name"
},

},
{
$unwind: "$name" //unwind because the lookup made name become an array with _id and text
},
{
$addFields: {
name: "$name.text" //rewrite name (currently an obj) into the translation string
}
},

(...etc)

问题是,我需要对每个需要翻译的键执行这 3 个步骤。在一个大文档上,看起来有点太多了,每一次$lookup感觉响应时间都在一点点增加。

这也没有后备情况,以防键在所述语言中不可用,例如,在西类牙语集合中的 id01_name 上尝试 $lookup 但集合没有它,所以后备将从英语收藏中获得。

这里是上述示例的一个工作示例: https://mongoplayground.net/p/umuPQYriFRe


手动聚合方法

我也想过分阶段做,就是

  • item.find()获取元素数据;
  • translation_english.find({ $in: [ (...listofkeys) ]}) 获取所有必要的英文键
  • translation_{otherlang}.find({ $in: [ (...listofkeys) ]}) 获取所有必要的其他语言键
  • 手动将两个翻译数组转换成两个对象(使用cursor.forEach()),合并Object.assign({},eng,otherlang)<
  • 精心挑选每个键并分配给项目对象

此方法涵盖了回退,但它过于臃肿/非常冗长。


在两次尝试的测试中,查找花费了 310 毫秒,而手册花费了 500 毫秒来完成,这是一次查找。但是手动有回退(也就是查询 3 个集合;item, lang_en, lang_{foreign})。如果 foreign 中不存在语言键,它将选择 en(假设 eng 永远不会错过键)。当查找外国语言失败时,查找无法返回文档。

最佳答案

您应该采用手动方法。

目前您正在使用两个查询来查找翻译,但实际上如果您将多种语言的翻译合并到一个文档中,它只需要一个查询:

[
{
"_id": "id01_name",
"en": "Item's Name",
"fr": "fraf"
},
{
"_id": "id01_desc",
"en": "Item's lore description"
},
{
"_id": "sk_id",
"en": "Item's skill description",
"jp": "jpjpj"
},

]

提高查询速度的一些注意事项:

  • 对返回的项目列表使用分页。即使每页 100 项也很容易查询。不确定您是否需要支持完整的集合检索,但这种情况很少见。
  • 在单个en 字段上索引translation 集合。无论如何,您应该回退到 en,所以只需要查询 where en = key
  • 使用您的语言键投影翻译文档,因此只返回三个字段:en__language___id
  • 让客户做渲染,他们可以选择他们需要的语言字段。如果您真的需要一个服务器预处理器,那么在包含 100 个项目的页面上使用 for 循环 无论如何都不会造成伤害。
  • 考虑将翻译缓存到 Redis,它很少更新,您可以利用 RAM 速度。

关于javascript - 当翻译在另一个集合中时,如何在 MongoDB 上处理 i18n(带回退)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58595128/

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