【问题标题】:Decode this MongoDB query解码这个 MongoDB 查询
【发布时间】:2014-12-19 23:07:08
【问题描述】:

我有一个 MongoDB 组查询。我理解了其中的大部分内容,但是“reduce”函数中的“if”条件位让我感到困惑。我不确定这样做的目的是什么。

db.users.group({
    "initial": {
        "countstar": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.countstar += true.length;
        else prev.countstar++;
    },
    "cond": {
        "location": null
    }
});

我知道“初始”参数的作用。我也知道“cond”参数在做什么。但是,“reduce”参数中的所有内容都令人困惑。

另外,什么是等效的 SQL?

【问题讨论】:

  • 我猜测某处有一个名为 true 的变量,代码会检查如何处理它?
  • @alernerdev 好的,两个连续的 if 条件是什么意思?它们是嵌套的吗?
  • 是的,嵌套的。它的要点是:检查它是否不为空。如果不是,请检查它的数组。如果是数组,则添加数组的长度。如果它不是数组,则加一。您可以通过使用缩进将其分成多行并放入花括号来使其更具可读性。您也可以使用此代码,设置不同的“true”值并观察会发生什么
  • 谢谢!另一个问题:MongoDB 查询的等效 SQL 是什么?

标签: mongodb group-by mongodb-query


【解决方案1】:

如果我们重新格式化它会更容易理解:

db.users.group({
   "initial": { "countstar": 0 },
   "reduce": function(obj, prev) {
        if (true != null) {
            if (true instanceof Array)
                prev.countstar += true.length;
            else 
                prev.countstar++;
        }
    },
    "cond": { "location": null }
 });

这肯定有问题,因为true 是 Javascript 中的布尔值,所以第一个条件始终成立,第二个条件永远成立,true.lengthundefined。看起来true 应该由obj 的某些属性代替。在这种情况下,代码的作用是对应该引用的任何数组属性 true 的长度求和,将非数组值计算为长度为 1 的数组。这段代码是从哪里来的?它真的有效并给你一个有意义的结果吗?你想从这段代码中得到什么结果?我认为你应该把这个功能扔掉。你可以用聚合做同样的事情,它会更好地工作。由于你不应该使用这段代码,而且我不擅长 SQL,所以我不会尝试将它翻译成 SQL。

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多