Как я могу извлечь целые документы, основываясь на том, как они сравниваются со всей их коллекцией? - PullRequest
2 голосов
/ 22 апреля 2019

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

Например, для следующей коллекции:

{ "date" : "2019-04-10", "id" : 1, "measurement" : 50 }
{ "date" : "2019-04-10", "id" : 2, "measurement" : 1 }
{ "date" : "2019-04-10", "id" : 3, "measurement" : 33 }
{ "date" : "2019-04-11", "id" : 1, "measurement" : 52 }
{ "date" : "2019-04-11", "id" : 3, "measurement" : 3 }
{ "date" : "2019-04-12", "id" : 1, "measurement" : 55 }
{ "date" : "2019-04-12", "id" : 2, "measurement" : 12 }

Приведенный выше сборник содержит измерения для 3 идентификаторов. Я хочу получить последние измерения для каждого идентификатора.

Например, приведенная выше коллекция должна дать следующий результат:

{ "date" : "2019-04-12", "id" : 1, "measurement" : 55 }
{ "date" : "2019-04-12", "id" : 2, "measurement" : 12 }
{ "date" : "2019-04-11", "id" : 3, "measurement" : 3 }

Пока что я могу извлечь самую последнюю дату для каждого идентификатора с помощью этого:

db.control_subs.aggregate([ { $group : { _id : "$id", "last_date" : { $max : "$date" } } }, { $sort:{ "_id": 1 }} ])

Но это, к сожалению, удаляет фактическое поле measurement из вывода.

Как я могу получить желаемый результат с помощью одного запроса MongoDB?

1 Ответ

0 голосов
/ 22 апреля 2019

Вы можете попробовать запрос ниже aggregation с оператором $$ROOT:

db.control_subs.aggregate([ 
    {
        "$project": 
            { 
                "id": "$id",
                "date": "$date", 
                "document": "$$ROOT" // save all fields for future usage
        }
    }, 
    { 
        "$sort": 
            { "date": -1 
        }
    }, 
    {
        "$group":
            {
                "_id":{"id":"$id"},
                "original_doc":{"$first":"$document"} 
        }
    }, 
    {
        $project: 
            {
                "original_doc.date":1, "original_doc.id":1, "original_doc.measurement":1, _id:0}
        } 
])

Выход вышеуказанной агрегации составляет

{ "original_doc" : { "date" : "2019-04-11", "id" : 3, "measurement" : 3 } }
{ "original_doc" : { "date" : "2019-04-12", "id" : 2, "measurement" : 12 } }
{ "original_doc" : { "date" : "2019-04-12", "id" : 1, "measurement" : 55 } }

Даже вы можете также заменить original_doc с помощью $ replaceRoot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...