Как найти последние записи в запросе mon go? - PullRequest
0 голосов
/ 05 февраля 2020

Предположим, в моей коллекции c есть записи, подобные этой:

{ "_id": ..., "name":"foo", "date": "2020-02-02 ...", "value": 10 ...}

, и я хочу найти для каждой name самую последнюю запись (по date) с положительным значением value.

Что-то вроде

def find_latest():
    res = {}
    for d in c.find({"value":{"$gt":0}}):
        key = d["name"]
        try:
            if d["date"] > res[key]["date"]:
                res[key] = d
        except KeyError:
            res[key] = d
    return res

, но значение l oop должно быть на стороне сервера.

Я подозреваю, что это должно быть выполнимо используя агрегацию , но мне кажется, что мне нужно написать JavaScript для этого ...

1 Ответ

0 голосов
/ 05 февраля 2020

Используя агрегацию, сначала сопоставьте требуемое значение, затем сортируйте по дате по убыванию, используйте группу, чтобы выбрать первый документ в списке для каждого имени. Поскольку список отсортирован по дате, это будет самое последнее.

db.collection.aggregate([
  {"$match":{"value":{"$gt":0}}},
  {"$sort":{"date":-1}},
  {"$group":{"_id":"$name", "document":{"$first":"$$ROOT"}}},
  {"$replaceRoot": {"newRoot": "$document"}} ])

(Обратите внимание, что это работает намного лучше, если вы индексируете {value:1, date:-1}

...