解码此MongoDB查询

时间:2014-12-19 23:07:09

标签: mongodb group-by mongodb-query

我有一个MongoDB组查询。我认为大部分内容都是如此,但是' 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'参数正在做。然而,整个内部的减少'参数令人困惑。

此外,什么是等效的SQL?

1 个答案:

答案 0 :(得分:0)

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

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。