2017-05-05 2 views
0

Ich möchte einen Join mit der $ lookup-Operation durchführen.

Meine Objekte enthalten 2D-Koordinatenfelder, und die Sammlung wird mit diesem Feld indiziert.

Ich möchte Objekt Paare finden.

Somit I erste Objekte extrahieren innerhalb eines kleinen Raumbereiches liegen und schiebe diese Auswahl in eine ‚z‘ Sammlung:

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

Dann komme ich diese ‚z‘ Auswahl mit der gleichen Auswahl aus der ursprünglichen Sammlung:

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'}}}, 
] 

Und mit diesem ‚$ Spiel‘ oben, würde Ich mag die Paare die ein Objekt mit mir selbst verwerfen:

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

Aber das funktioniert nicht:

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')}} 

Offensichtlich ist das Spiel arbeiten nicht, da das Paar # 0 ist ein Paar von einem Objekt zu sich.

Wie schreibt man den $ match-Vorgang ?? Es scheint, dass der Operator '$ ne' nicht für Objekt-IDs gelten würde ????

Dank Christian

Antwort

0

Sie können Ihre $match mit $redact ersetzen.

$redact wird $_id & $ns._id und wird $$PRUNE passende IDs und $$KEEP nicht passenden ids vergleichen.

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

Vielen Dank für diesen Vorschlag ... Ich werde es versuchen –

+0

... und natürlich werde ich Sie wissen lassen, ob es funktioniert hat ;-). Christian –

+0

OK: Was Sie vorgeschlagen haben funktioniert gut. Danke noch einmal. Ich schließe. Christian –

Verwandte Themen