2017-05-05 18 views
0

$ lookup操作を使用して結合を実行したいとします。

私のオブジェクトには2D座標フィールドが含まれており、このフィールドにはコレクションがインデックスされています。

オブジェクトのペアを検索したいと思います。

したがって、私は第1小空間領域内にあるオブジェクトを抽出し、「Z」コレクションにこの選択をプッシュ:

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': {'_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は、自身への1つのオブジェクトのペアであるため、試合は動作しませんでした。

$ match操作の記述方法?? '$ ne'演算子はオブジェクトIDには適用されないようです

おかげ クリスチャン

答えて

0

あなたは$redactであなたの$matchを置き換えることができます。

$redact$_id & $ns._idを比較すると$$PRUNEは、IDSと$$KEEP非マッチングIDが一致します。

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

私はそれを試してみます –

+0

...もちろん、それがうまくいっているかどうかをお知らせします;-)。クリスチャン –

+0

OK:あなたが提案したものはうまく動作します。再度、感謝します。閉める。キリスト教の –

関連する問題