2014-02-02 2 views
4

У меня есть локализация , где каждый документ представляет собой пару с ключом, переведенную на несколько языков.mongodb coalesce equivalent (with mongoose)

Это представление JSON:

[ 
    { "_id": "form.password" , "en": "Password" , "he": "סיסמא" , "ru": "пароль" } 
    { "_id": "form.email" , "en": "Email"  , "he": "אימייל" }, 
    { "_id": "form.firstname", "en": "First Name", "he": "שם פרטי", "ru": "Имя" } 
] 

Это мангуст схема:

new Schema({ 
    _id: { 
    type: String, 
    required: true 
    }, 
    en: String, 
    he: String, 
    ru: String 
}); 

Мне нужно, чтобы все ключевые значения на каждый язык с express.js:

app.get('/api/locals', function(req, res) { 
    Local.find().select(req.query.language).exec(function(err, data) { 
    res.json(data); 
    }); 
}); 

Это нормально работает , если каждый язык имеет значения для всех ключей, но я хочу сделать fallback где, если какой-либо язык не имеет значения для определенного ключа, тогда будет использовано английское значение.

Я думал, может быть, мне следует использовать агрегацию или mapReduce, но я не знаю, как реализовать это с помощью мангуста.

С SQL я использовал, чтобы написать этот запрос:

SELECT key, COALESCE($language , en) as value FROM locals 

Спасибо заранее.

+0

Существует не один еще, есть JIRA для этого, но я забыл, где он сейчас – Sammaye

ответ

6

Я нашел решение с Aggregation framework:

Использование $project с $ifNull:

app.get('/api/locals', function(req, res) { 
    Local.aggregate({ 
    $project: { 
     value: { 
     $ifNull: ["$" + req.query.language , "$en"] 
     } 
    } 
    }).exec(function(err, data) { 
    res.json(data); 
    }); 
}); 
+0

It является одним из способов, но, к сожалению, на самом деле это так же медленно, как и в приложении, возможно, если не медленнее, так как больше нужно вычислить – Sammaye

+0

@Sammaye Можете ли вы объяснить, почему это происходит медленно? –

+0

Полная проверка коллекции для одного, также он вызывает MongoDB, чтобы просто сделать что-то, что было бы так же быстро, как и приложение – Sammaye