我正在尝试进行查询,在该查询中可以使用特定条件为属性提供值以供将来匹配。 示例任务文档重叠(并非我可以过滤的所有字段):
{
_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。我不使用组,因为它给我带来了严重的性能问题。