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"
}
]);
请注意 DEU
和 ESP
有西班牙语翻译,但是 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"] }
}
}
我最近在 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"
}
]);
请注意 DEU
和 ESP
有西班牙语翻译,但是 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"] }
}
}