【问题标题】:mongodb coalesce equivalent (with mongoose)mongodb 合并等价物(与猫鼬)
【发布时间】:2014-02-03 01:36:33
【问题描述】:

我有一个 本地化 集合,其中每个文档都是翻译成多种语言的键值对。

这是一个 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);
  });
});

这很好用如果每种语言都有所有键的值,但我想做一个后备,如果某种语言对某个键没有价值,那么英语值将被使用。

我想也许我应该使用聚合或 mapReduce,但我不知道如何使用 mongoose 来实现。

我用 SQL 来写这个查询:

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

提前致谢。

【问题讨论】:

  • 目前还没有,有一个 JIRA 可以解决这个问题,但我忘记了它现在在哪里

标签: node.js mongodb mongoose


【解决方案1】:

我找到了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);
  });
});

【讨论】:

  • 这是一种方法,但不幸的是,它实际上和在应用程序中执行它一样慢,如果不是更慢的话,因为必须计算更多
  • @Sammaye 你能解释为什么它很慢吗?
  • 对一个完整的集合扫描,它还调用 MongoDB 来做一些与应用程序端一样快的事情
猜你喜欢
  • 2012-10-29
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多