MongoDB Multilingual - Switch Case - PullRequest
       11

MongoDB Multilingual - Switch Case

0 голосов
/ 07 сентября 2018

Я недавно начал с MongoDB на Node.js, и мне нужна помощь коллег по следующей ситуации.

Я уже упоминал Многоязычное моделирование данных на 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']
  }
})

Я хотел бы получить данные в таком видеТаким образом, когда перевод отсутствует, он должен принять значение по умолчанию, то есть ru

Равный 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 в запрос.

1 Ответ

0 голосов
/ 07 сентября 2018

Итак, давайте начнем с некоторых стран в нашей базе данных

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"
   }
]);

Обратите внимание, что DEU и ESP имеют испанский перевод, а GB - нет.

Теперь мы можем написать простой запрос агрегации, используя оператор $ifNull (https://docs.mongodb.com/manual/reference/operator/aggregation/ifNull/) для получения значения es, если оно существует, или en, если нет.

например, запрос ESP вернет es имя:

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

однако запрос GB вернет en имя:

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

Чтобы сделать поле es динамическим, вам нужно просто создать выражение "$name.es" того, что вы хотите выбрать в вашем приложении, например:

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"] }
  }
}
...