MongoDB комплекс $ cond - PullRequest
       2

MongoDB комплекс $ cond

0 голосов
/ 17 сентября 2018

Я пытаюсь выполнить запрос, в котором я могу использовать определенное условие, чтобы присвоить значение свойству для будущего соответствия. Примеры задач документов с перекрытием (не все поля, которые я могу отфильтровать):

{
    _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. Я не пользуюсь группой, потому что это приводит к серьезным проблемам с производительностью.

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