如何在猫鼬中构建各种相互依赖的模式或如何使用' reference'正常吗?

时间:2018-02-14 12:51:56

标签: javascript node.js mongodb mongoose

我目前正在使用node.js,Express,MongoDB和mongoose开发词汇表应用程序。

我的目标:根据前端的选择(E. g。:德语>英语,英语>葡萄牙语等)推出各种语言的翻译。

主要问题:相互依赖的架构。存储在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并添加作为属性存在的所有语言并添加单词的相应翻译来解决此问题。但这对我来说似乎不是最好的解决方案,因为我从一开始就不会将这些单词翻译成所有语言。因此,应该存储那些实际存在翻译的单词的翻译。

1 个答案:

答案 0 :(得分:1)

<强> LanguageSchema

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架构中,您需要使用word_nameword_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个参数

  

word,input_language,output_language

示例:你想要&#34;朋友&#34;含义从英语到葡萄牙语

所以在这种情况下:

  

字=&#34;朋友&#34; ,input_language =&#34;英语&#34; ,   output_language =&#34;葡萄牙&#34;

现在应用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);

    }
})