Я бы хотел получить новейшие документы на основе поля timestamp
, сгруппированного по некоторым полям (поэтому последний документ для каждой уникальной комбинации полей).
Учитывая, что у меня есть следующие документы:
{ timestamp: 1, a: 'foo', b: 'bar' }
{ timestamp: 2, a: 'foo', b: 'baz' }
{ timestamp: 3, a: 'bar', b: 'qux' }
{ timestamp: 4, a: 'bar', b: 'qux' }
Мне нужны следующие документы, когда я группирую их по a
и b
:
{ timestamp: 1, a: 'foo', b: 'bar' }
{ timestamp: 2, a: 'foo', b: 'baz' }
{ timestamp: 4, a: 'bar', b: 'qux' }
В моем приложении я хочу отфильтровать результаты поa
, например,когда мне нужны только самые последние документы для каждого возможного значения b
Количество документов на уникальную комбинацию полей не ограничено, a
и b
могут иметь произвольные значения.
Я пробовал несколько подходов для решения проблемы, но я не уверен, какой из них более эффективен.
- Сохранение «последнего» документа для каждой уникальной комбинации, которая обновляется каждый раз, когда вставляется новый документи содержит идентификатор самого последнего документа для этой уникальной комбинации полей.
- Создайте пользовательскую функцию сокращения, которая отфильтровывает «старые» записи:
function mapFun(doc) {
emit(doc.a, [doc.a, doc.b, doc.timestamp, doc._id]);
}
function reduceFun(keys, values, rereduce) {
if (rereruce) values = [values];
var latest = {};
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values[i].length; j++) {
var value = values[i][j];
var key = value[0] + value[1];
if (!latest[key] || latest[key][2] < value[2]) latest[key] = value;
}
}
var results = [];
for (var key in latest) {
results.push(latest[key]);
}
return results;
}