我目前正在使用node.js,Express,MongoDB和mongoose开发一个词汇应用程序。
我的目标是:根据前端的选择发布各种语言的翻译(例如:德语>英语,英语>葡萄牙语等)
主要问题:相互依赖的架构。 WordSchema
中存储的单词的翻译取决于LanguageSchema
表示的语言。
对我来说,关于如何构造相关的Schemas
,有两种不同的方法:
1。
有一个Schema
代表语言(例如德语,英语,...)。它根据语言存储几个单词。因为Word
代表另一个Schema
,所以它引用了WordSchema
内部的LanguageSchema
。这里出现的问题是单词的值取决于所选的语言。
var Schema = mongoose.Schema;
var LanguageSchema = new Schema({
language: String, // 'German'
words: [{type: Schema.ObjectId, ref: 'Word'}]
// word: 'Haus' instead of e. g. 'house'
});
module.exports = mongoose.model('Language', LanguageSchema);
var WordSchema = new Schema({
name: String // 'house', 'Haus', 'casa' depending on the language
});
module.exports = mongoose.model('Word', WordSchema);
2.我可以通过仅使用
WordSchema
并添加作为属性存在的所有语言并添加单词的相应翻译来解决此问题。但这对我来说似乎不是最佳的解决方案,因为我不会从一开始就将单词翻译成所有语言。因此,仅应在实际存在翻译的地方存储这些翻译。 最佳答案
语言模式
var Schema = mongoose.Schema;
var LanguageSchema = new Schema({
language_name: {type:String}, // English
language_code: {type:String} // en
});
module.exports = mongoose.model('Language', LanguageSchema);
在Word Schema中,您需要使用
word_name
和word_language
推送对象WordSchema
var WordSchema = new Schema({
words:[{
word_name:{type:String},
word_language:{type:String}
}]
});
module.exports = mongoose.model('Word', WordSchema);
示例:数据库中的语言
languages : [
{
"_id":"54ef3f374849dcaa649a3abc",
"language_name":"English" ,
"language_code":"en"
},
{
"_id":54ef3f374849dcaa649a3asd",
"language_name":"Portuguese" ,
"language_code":"pt"
},
{
"_id":54ef3f374849dcaa649a3xxx",
"language_name":"German" ,
"language_code":"de"},
]
示例:数据库中的单词
words:[
{
word:[
{
"_id":"54ef3f374849dcaa649azzz",
"word_name":"Friend" ,
"word_language":"English"
},
{
"_id":"54ef3f374849dcaa6491111",
"word_name":"Amigo" ,
"word_language":"Portuguese"
},
{
"_id":"54ef3f374849dcaa649a233",
"word_name":"Freund" ,
"word_language":"German"
},
]
},
{ word: [...] },
{ word: [...] },
{ word: [...] },
{ word: [...] }
]
从前端,您必须传递3个参数
单词,input_language,output_language
示例:您要从英语到葡萄牙语的“朋友”含义
所以在这种情况下:
word =“ Friend”,input_language =“英语”,
output_language =“葡萄牙语”
现在应用Mongoose查找查询并在WordSchema中搜索Word
Word.findOne({word_name:{ $regex:word, $options: "$i" },word_language:input_language},function(err,result){
if(err){ return err;}
if(!err && result){
// now you have to use underscore.js and find out result by output language
// http://underscorejs.org
// . npm i --save underscore
var outputObj= _.find(result.word, { word_language :output_language});
res.json(outputObj);
}
})