【问题标题】:Get elements with biggest attribute using find only仅使用 find 获取具有最大属性的元素
【发布时间】:2016-03-10 08:50:04
【问题描述】:

编辑:好的,知道了。它不能通过查找来完成。我以另一种方式解决了这个问题,但它与这个问题完全无关:我添加了一个布尔字段“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过滤那些(我真的不喜欢这种解决方案)

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

我该怎么做?

【问题讨论】:

  • 就像我在问题中写的那样:“我必须过滤这个并为每个 group_id 获取日期最大的元素”。因此,对于具有相同 group_id 的所有项目,我必须只获得日期最大的项目
  • 哦,对不起,我的错。我现在解决这个问题:)
  • 您了解.find() 的基本功能,不是吗?而且您了解您要的是“分组”边界中具有最大字段值的文档吗?对? (我的意思是,你甚至称它为 group_id )。应该很清楚 .find() 不能做到这一点,而 .aggregate() (特别是“组”的管道阶段)是这样做的工具。当然流星可以使用.aggregate(),它不是独立软件,它使用核心节点驱动程序。您只能在浏览器中.aggregate()。这对数据库来说是件好事。
  • 好的,谢谢。我仍然不是“聚合”(失去反应性)的好朋友,我更喜欢以另一种方式解决这个问题

标签: javascript mongodb meteor nosql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2010-11-30
    • 2019-11-16
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多