$ match(聚合)无法比较两个对象ID

时间:2017-05-05 10:04:29

标签: mongodb aggregation-framework

我想使用$ lookup操作执行连接。

我的对象包含2D坐标字段,集合使用此字段编制索引。

我想找到Object

因此,我首先提取位于小空间区域内的对象,并将此选择推送到''系列:

p1 = [
    {'$geoNear':
        {
            'near': [0, 0],
            'query': { 'loc': { '$geoWithin': {'$box': [bottomleft, topright] } } },
            'distanceField': 'dist',
        }
    },
    {'$out': 'z'},
]

然后我加入了这个' z'从原始集合中选择相同的选项:

p2 = [
    {'$geoNear':
        {
            'near': [0, 0],
            'query': { 'loc': { '$geoWithin': {'$box': [bottomleft, topright] }  } },
            'distanceField': 'dist',
        }
    },
    {'$lookup': {'from':'z', 'localField':'y.loc', 'foreignField':'z.loc', 'as':'ns'} },
    {'$unwind': '$ns'},
    {'$match': {'_id': {'$ne': '$ns._id'}}},
]

使用这个' $ match'在上面,我想拒绝涉及一个对象的对:

{'$match': {'_id': {'$ne': '$ns._id'}}},

但这不起作用:

0 {'_id': ObjectId('5908e654d15fa1043596a382'), 'dist': 0.0, 'ns': {'_id': ObjectId('5908e654d15fa1043596a382')}}
1 {'_id': ObjectId('5908e654d15fa1043596a382'), 'dist': 0.06338084493056388, 'ns': {'_id': ObjectId('5908e674d15fa10435cc739e')}}
2 {'_id': ObjectId('5908e654d15fa1043596a382'), 'dist': 0.227329384268223, 'ns': {'_id': ObjectId('5908e65fd15fa10435ab436e')}}
3 {'_id': ObjectId('5908e654d15fa1043596a382'), 'dist': 0.23787682552971529, 'ns': {'_id': ObjectId('5908e64cd15fa1043585a065')}}

显然,匹配没有运作,因为#0对是一对对象。

如何编写$ match操作?似乎' $ ne'运算符不会申请对象ids ????

由于 基督教

1 个答案:

答案 0 :(得分:0)

您可以将$match替换为$redact

$redact会比较$_id& $ns._id $$PRUNE匹配ID和$$KEEP非匹配ID。

{
    $redact: {
        $cond: [{
                $eq: ["$_id", "$ns._id"]
            },
            "$$PRUNE",
            "$$KEEP"
        ]
    }
}