MongoDB 多语言 - Switch Case

MongoDB Multilingual - Switch Case

我最近在 Node.js 上开始使用 MongoDB,在以下情况下我需要其他人的帮助。

我已经提到了 Multilingual data modeling on MongoDB 这也是我正在关注的类似架构结构。

我正在创建多语言格式和架构的国家列表,如下所示。

var CountrySchema = new Schema({
  name: {
    type: Object,
    required: 'Kindly enter the name of the country'
  },
  Short_code: {
    type: String,
    required: 'Please enter the country code'
  },
  Created_date: {
    type: Date,
    default: Date.now
  },
  status: {
    type: [
      {
        type: String,
        enum: ['published', 'unpublished', 'deleted']
      }
    ],
    default: ['published']
  }
})

我想以这样一种方式获取数据,当翻译丢失时,它应该采用默认的方式,即 en

等式SQL如下。

SELECT Short_code, 
CASE
  WHEN name.es IS NOT NULL THEN name.es
  WHEN name.es IS NULL and name.en IS NOT NULL name.en
END AS name
FROM countries;

此外,如果我能将 es 值动态传递给查询,那就太好了。

那么让我们从数据库集合中的一些国家开始

db.countries.insertMany([
   {
       "name" : {
           "en": "Germany",
           "es": "Alemania",

       },
       "Short_code" : "DEU"
   },
   {
       "name" : {
           "en": "Spain",
           "es": "España",

       },
       "Short_code" : "ESP"
   },
   {
       "name" : {
           "en": "England"

       },
       "Short_code" : "GB"
   }
]);

请注意 DEUESP 有西班牙语翻译,但是 GB 没有。

现在我们可以编写一个简单的聚合查询,利用 $ifNull 运算符 (https://docs.mongodb.com/manual/reference/operator/aggregation/ifNull/) 获取 es 值(如果存在)或 en(如果不存在)。

例如查询 ESP 将 return es 姓名:

> db.countries.aggregate([
... { $match: { "Short_code" : "ESP" } },
... { $project: { "name" : { $ifNull: ["$name.es", "$name.en"] }}}
... ]);
{ "_id" : ObjectId("5b923f4b1f269cd18cd2f209"), "name" : "España" }

但是查询 GB 将 return en 名称:

> db.countries.aggregate([
... { $match: { "Short_code" : "GB" } },
... { $project: { "name" : { $ifNull: ["$name.es", "$name.en"] }}}
... ]);
{ "_id" : ObjectId("5b923f4b1f269cd18cd2f20a"), "name" : "England" }

要使 es 字段动态化,您只需在应用程序中构建 "$name.es" 您想要 select 内容的表达式,例如:

var userLanguage = "es";

{ $project: { "name" : { $ifNull: ["$name." + userLanguage, "$name.en"] }}}

只得到"Short_code" & "Country Name",代码是

{
  $project: {
    "_id": 0,
    "Short_code": 1,
    "name" : { $ifNull: ["$name." + userLanguage, "$name.en"] }
  }
}