У меня есть ряд заказов, как показано ниже в коллекции mongodb:
id date value
A 1 Jan 18 1
A 2 Jan 18 0
A 3 Jan 18 0
B 14 Jan 18 4
B 15 Jan 18 5
B 16 Jan 18 0
Используя конвейер агрегации mongodb (mongo 3.4), я пытаюсь выяснить для каждого идентификатора, на какую дату это значениеизменяет на 0 с ненулевого значения, а также на «группу идентификаторов» для этих записей.
Второе обновление: 26 мая 19
Я обновил вопрос допрояснить, как выглядит первая, последняя реализация:
{
"$addFields": {
"date": {
"$dateFromString": {
"dateString": "$date"
}
}
}
},
{
$group: {
_id: {
"id": "$id",
"value": "$value"
},
"first": {
"$first": "$date"
},
"last": {
"$last": "$date"
}
}
},
{
"$match": {
"_id.value": 0
}
}
https://mongoplayground.net/p/moBRI2Q7aGu
Это дает мне:
id value first last
A 0 2 Jan 18 3 Jan 18
B 0 16 Jan 18 16 Jan 18
Если я посмотрю на «первый«даты, это даты, когда значение вначале становится 0 из ненулевого значения.
Однако я хотел бы видеть всю« группу идентификаторов »тех значений, которые в какой-то момент становятся 0 из ненулевого значениявремя.Итак:
id value first last
A 1 1 Jan 18 1 Jan 18
A 0 2 Jan 18 3 Jan 18
B 4 14 Jan 18 14 Jan 18
B 5 15 Jan 18 15 Jan 18
B 0 16 Jan 18 16 Jan 18
Чтобы получить это, мне нужно получить доступ к групповому этапу перед совпадением вышеуказанного конвейера, поэтому https://mongoplayground.net/p/YTP-NBJtO4R, и как-то отфильтровать это с набором результатов из первого конвейера агрегации.Я делаю это в пандах через левое соединение с первым набором результатов, но это выглядит не элегантно.
Итак, теперь у меня есть два разных конвейера, что кажется немного неудобным.В идеале последний набор результатов должен получаться из одного конвейера агрегации.