【问题标题】:MongoDB Multilingual - Switch CaseMongoDB 多语言 - 切换案例
【发布时间】:2018-09-07 07:06:58
【问题描述】:

我最近开始在 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 值动态传递给查询,那就太好了。

【问题讨论】:

  • 你也可以举一个你的文档的例子吗?

标签: node.js mongodb mongodb-query nodes mongojs


【解决方案1】:

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

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 将返回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"] }
  }
}

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2021-12-07
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多