MongoDB复合体$ cond

时间:2018-09-17 12:24:22

标签: mongodb

我正在尝试进行查询,在该查询中可以使用特定条件为属性提供值以供将来匹配。 示例任务文档重叠(并非我可以过滤的所有字段):

{
    _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可以删除重复项。 一个示例是使用ObjectId(“ 5acf559c93e81a000f43a0a5”)更改第一个$ match上下文。 问题是,我不会总是得到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。我不使用组,因为它给我带来了严重的性能问题。

0 个答案:

没有答案