编辑:好的,明白了。找不到它。我用另一种方式解决了这个问题,但它与相当无关这个问题:我添加了一个布尔字段“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),但我不知道它们有多可靠,因为这是一个需要坚如磐石的项目
我该怎么做?
答案 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;