使用仅查找

时间:2016-03-10 08:50:04

标签: javascript mongodb meteor nosql

编辑:好的,明白了。找不到它。我用另一种方式解决了这个问题,但它与相当无关这个问题:我添加了一个布尔字段“last_inserted”并使用了流星钩子来确保只有最后插入的字段才有该字段。无论如何,谢谢大家。

我正在 Meteor 项目中,并且有一个这样的集合:

group_id, date, attribute1, attributeN
1, 2015-11-26 09:40:23.000Z, "foo", "bar"
1, 2015-11-23 14:23:53.000Z, "foo", "bar"
2, 2015-11-23 14:24:01.000Z, "foo", "bar"
2, 2015-11-23 14:25:44.000Z, "foo", "bar"

我必须对此进行过滤,并为每个group_id获取具有最大日期的元素,结果如下:

group_id, date, attribute1, attributeN
1, 2015-11-26 09:40:23.000Z, "foo", "bar"
2, 2015-11-23 14:25:44.000Z, "foo", "bar"

我在一些相关问题中读到可以使用aggregate运算符完成: MongoDB - get documents with max attribute per group in a collection

但Meteor 仍未实现,我必须使用find

我不是MongoDB专家,而且我正在阅读很多documentation,但是我开始担心如果没有所有元素,我就无法做到这一点并在javascript中手动过滤那些(我真的不喜欢这种解决方案)

我读到有一些meteor包添加了聚合命令(如this),但我不知道它们有多可靠,因为这是一个需要坚如磐石的项目

我该怎么做?

1 个答案:

答案 0 :(得分:0)

这是一个普通Javascript中的提议,带有一个临时对象,用于引用结果数组。



var data = [{ group_id: 1, date: '2015-11-26 09:40:23.000Z', attribute1: 'foo', attributeN: 'bar' }, { group_id: 1, date: '2015-11-23 14:23:53.000Z', attribute1: 'foo', attributeN: 'bar' }, { group_id: 2, date: '2015-11-23 14:24:01.000Z', attribute1: 'foo', attributeN: 'bar' }, { group_id: 2, date: '2015-11-23 14:25:44.000Z', attribute1: 'foo', attributeN: 'bar' }],
    result = function (data) {
        var r = [], o = {};
        data.forEach(function (a) {
            if (!(a.group_id in o)) {
                o[a.group_id] = r.push(a) - 1;
                return;
            }
            if (a.date > r[o[a.group_id]].date) {
                r[o[a.group_id]] = a;
            }
        });
        return r;
    }(data);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
&#13;
&#13;