我建议将类别(或多个类别)存储为产品中的标识符,而不是进行非规范化。由于您通常会有一个应用程序/中间层/Web 服务器对 MongoDB 进行查询,因此为类别及其在内存中的翻译应用一个简单的缓存层是合理的(您甚至不需要缓存它们很长,如果这很重要)。
Product {
"_id" : ObjectID("..."),
"name" : "MyProduct",
"category" : ObjectID("..")
}
Category {
"_id" : ObjectID("..."),
"en-us" : "cheese",
"de-de" : "Käse",
"es-mx" : "queso"
}
或者,可以使用更多结构存储类别以处理区域差异:
Category {
"_id" : ObjectID("..."),
"en" : { default: "cheese" }
"de-de" : { default: "käse", "at": "käse2" }
"es" : { default: "queso" }
}
如果您执行以下查询:
db.products.find({ price : { $gt: 50.00 }})
它返回匹配列表,您可以从匹配的产品文档中收集所有类别,并用于$in
快速获取当前语言环境的任何非缓存类别值。因此,您可以通过使用此技术进行查询来最大限度地减少到数据库的额外往返次数。如果您有大量类别要匹配,您可以考虑分批进行。
db.categories.find( { _id : { $in : [array_of_ids] } });
然后,将它们匹配在一起。