Я пытаюсь выполнить запрос, в котором я могу использовать определенное условие, чтобы присвоить значение свойству для будущего соответствия.
Примеры задач документов с перекрытием (не все поля, которые я могу отфильтровать):
{
_id: ObjectId("5acf559b93e81a000f43a098"),
start: ISODate('2017-06-20T16:00:00.000Z'),
end: ISODate('2017-06-20T20:00:00.000Z'),
group: 'First',
context: [
ObjectId("5acf559c93e81a000f43a0a1"),
ObjectId("5acf559c93e81a000f43a0a3"),
ObjectId("5acf559c93e81a000f43a0a5")
],
overlapping: [
{
accepted: false,
taskId: ObjectId("5acf55a193e81a000f43a0d7")
}
]
},
{
_id: ObjectId("5acf55a193e81a000f43a0d7"),
start: ISODate('2017-06-20T18:00:00.000Z'),
end: ISODate('2017-06-20T22:00:00.000Z'),
group: 'Second',
context: [
ObjectId("5acf499e93e81a000f430344"),
ObjectId("5acf559c93e81a000f43a0a5")
],
overlapping: [
{
accepted: false,
ObjectId("5acf559b93e81a000f43a098")
}
]
},
Пример агрегата:
[
{
$match: {
context: ObjectId("5acf559c93e81a000f43a0a1")
}
},
{
$unwind: '$overlapping'
},
{
$lookup: {
from: 'tasks',
localField: 'overlapping.taskId',
foreignField: '_id',
as: 'task2'
}
}, {
$unwind: '$task2'
}, {
$project: {
_id: false,
'task1Id': '$_id',
'task1.start': '$start',
'task1.end': '$end',
'task2Id': '$task2._id',
'task2.start': '$task2.start',
'task2.end': '$task2.end',
'accepted': '$overlapping.accepted',
'cmp_value': {$cmp: ['$_id', '$task2._id']}
}
}, {
$match: {
'cmp_value': {'$lt': 0}
}
}, {
$skip: 0
}, {
$limit: 10
}
]
Я использую cmp_value
, потому что запрос МОЖЕТ вернуть мне 2 записи для каждого перекрытия, поэтому со вторым $ match я могу удалить дубликаты.
Примером является изменение первого контекста $ match с помощью ObjectId ("5acf559c93e81a000f43a0a5").
Проблема в том, что я не всегда получаю 2 записи причины первого совпадения, которые могут отфильтровать одну из двух.
Как следствие, некоторые совпадения не показаны, как в примере выше.
Желаемый вывод:
{
task1Id: ObjectId("5acf559b93e81a000f43a098"),
task2Id: ObjectId("5acf55a193e81a000f43a0d7"),
task1: {
start: ISODate('2017-06-20T18:00:00.000Z'),
end: ISODate('2017-06-20T22:00:00.000Z')
},
task2: {
start: ISODate('2017-06-20T18:00:00.000Z'),
end: ISODate('2017-06-20T22:00:00.000Z')
},
accepted: false
}
Кто-нибудь понял, как я могу решить эту проблему ??
P.S. Я не пользуюсь группой, потому что это приводит к серьезным проблемам с производительностью.