2017-08-29 6 views
0

J'essaie d'exécuter une requête sur un mongoDB et d'utiliser $near dans la requête. Cette requête ci-dessous fonctionne, mais je dois aggraver sur la base de LAT et de GNL. J'essaie d'agréger ou d'obtenir un compte basé sur ceux qui sont à une certaine distance de pickup_location.

J'utilise ce qui suit dans un shell , PAS de code.

EST ICI UN RECORD:

      { 
"_id": { 
    "$oid": "5445ab058767000062" 
}, 
"comment": null, 
"dropoff_address": "XHgwMmB7fk1lRn59YFx4MDM=U2FsdGVkX19s3u4NEtImfofJzxnGreGpsna8qA4uVrq7exRDVy+zPn5UwDOj\nzpIs", 
"dropoff_location": [ 
    -97.816991, 
    30.189151 
], 
"pickup_address": "XHgwMmB7fk1lRn59YFx4MDM=U2FsdGVkX1/23mD3Vv3Nyf4/t+AEickIgOlkaxVp5y/e/5Ia2d3Z0OXtnejw\nrOK+ZPvxQontA9SS30t+MbUIrCMhndxpYcKNFm4xfOzRVxM=", 
"pickup_location": [ 
    -97.82075191025548, 
    30.20993147664687 
], 
"scheduled_request": false, 
"status": "blah", 
"timestamp_requested": { 
    "$date": "2014-10-21T00:38:28.990Z" 
}, 
"total_owed_in_cents": 0, 
"total_received_from_in_cents": 0, 
"user_id": "5445a9000057" 

}

cela fonctionne:

db.thing_requests.aggregate(
     [ 
     {$match: {total_received_in_cents: {$gt:1800}, requested_type: 'Blah' }}, 
     { 
      $group: 
      { 
       _id: null, 
       average: { $avg: "$total_received_in_cents" } 
      } 
     } 
     ] 
    ) 

BESOIN DE CE AJOUTE CE QUI FONCTIONNE CI-DESSUS:

{ 
    the_location: { 
     $near: { 
     $geometry: { 
      type: "Point" , 
      coordinates: [ <longitude> , <latitude> ] 
     }, 
     $maxDistance: <distance in meters>, 
     $minDistance: <distance in meters> 
     } 
    } 
    } 

MISE À JOUR:

La requête supérieure fonctionne. Ce dont j'ai besoin est de dire tous les éléments qui sont agrégés, je dois également être sûr qu'ils sont près d'un certain LAT & GNL.

MISE À JOUR 2:

Ran cette requête

 db.thing_requests.aggregate([ 
      { 
      $geoNear: { 
       near: { type: "Point", coordinates: [ -97.888,37.3222 ] }, 
       distanceField: "dist.calculated", 
       maxDistance: 2, 
       minDistance :1, 
       query: {total_received_in_cents: {$gt:1800}, requested_type: 'Blah' }, 
       includeLocs: "dist.location", 
       num: 5, 
       spherical: true 
      } 
      }, 
     { 
      $group: 
       { 
        _id: "$user_id", 
        average: { $avg: "$total_received_from_requester_in_cents" } 
       } 

     } 
     ]) 

RECU CE ERREUR:

assert: command failed: { 
     "errmsg" : "exception: geoNear command failed: { ok: 0.0, errmsg: \"no geo indices for geoNear\" }", 
     "code" : 16604, 
     "ok" : 0 
    } : aggregate failed 
    Error: command failed: { 
     "errmsg" : "exception: geoNear command failed: { ok: 0.0, errmsg: \"no geo indices for geoNear\" }", 
     "code" : 16604, 
     "ok" : 0 
    } : aggregate failed 
     at Error (<anonymous>) 
     at doassert (src/mongo/shell/assert.js:11:14) 
     at Function.assert.commandWorked (src/mongo/shell/assert.js:254:5) 
     at DBCollection.aggregate (src/mongo/shell/collection.js:1278:12) 
     at (shell):1:23 
    2017-08-28T21:21:40.153-0500 E QUERY Error: command failed: { 
     "errmsg" : "exception: geoNear command failed: { ok: 0.0, errmsg: \"no geo indices for geoNear\" }", 
     "code" : 16604, 
     "ok" : 0 
    } : aggregate failed 
     at Error (<anonymous>) 
     at doassert (src/mongo/shell/assert.js:11:14) 
     at Function.assert.commandWorked (src/mongo/shell/assert.js:254:5) 
     at DBCollection.aggregate (src/mongo/shell/collection.js:1278:12) 
     at (shell):1:23 at src/mongo/shell/assert.js:13 
+1

Qu'entendez-vous par "ajouté"? Vous ne pouvez pas utiliser '$ near' dans un autre niveau de pipeline autre que le ** premier **, car il a besoin ** d'un index **, et vous voudrez probablement [' $ geoNear'] (https: //docs.mongodb .com/manual/reference/operator/aggregation/geoNear /) étant donné qu'il s'agit d'une étape de pipeline spéciale qui renvoie la "distance" en tant que valeur ajoutée au document, ce qui est généralement important lorsque vous manipulez les résultats ordre retourné. Vous devriez plutôt montrer un petit échantillon de données et le résultat que vous espérez atteindre. –

+0

J'ai mis à jour pour illustrer ce que je cherche. – jdog

+0

Semble comme '$ geoNear' avec l'autre requête ajoutée à l'option' query' de cette phase du pipeline. Vous pouvez également simplement inclure '$ near' avec les autres conditions dans' $ match' puisque vous n'avez pas vraiment besoin de ** la sortie de distance si vous voulez juste agréger une moyenne à partir des documents retournés. Notez qu'il y a "une différence" en ce que '$ geoNear' renvoie les documents' 100' seulement par défaut.Vous pouvez "régler" cela, mais si vous avez un nombre indéterminé où la valeur de distance n'a pas d'importance que vous devriez probablement ajouter le '$ near'. –

Répondre

1

utilisation geoNear $ dans la première phase

db.thing_requests.aggregate([ 
    { 
    $geoNear: { 
     near: { type: "Point", coordinates: [ long,lat ] }, 
     distanceField: "dist.calculated", 
     maxDistance: 2, 
     minDistance :1, 
     query: {total_received_in_cents: {$gt:1800}, requested_type: 'Blah' }, 
     includeLocs: "dist.location", 
     num: 5, 
     spherical: true 
    } 
    }, 
{ 
    //use $group here 
} 
]) 

vous pouvez utiliser $ près trop

db.thing_requests.find({ 
    the_location: { 
$near: { 
    $geometry: { 
     type: "Point" , 
     coordinates: [ <longitude> , <latitude> ] 
    }, 
    $maxDistance: <distance in meters>, 
    $minDistance: <distance in meters> 
} 
},total_received_in_cents: {$gt:1800}, requested_type: 'Blah' 
}); 

mais dans tous les cas, vous devez spécifier un géospatiale (2d, 2dsphere) index sur le champ « the_location » si vous utilisez mangouste il y a un moyen simple de le faire spécifier l'index 2d ou 2dsphere comme dans votre schéma

the_location: { 
    type: [Number], // format will be [ <longitude> , <latitude> ] 
    index: '2dsphere'  // create the geospatial index 
} 
commande

ou l'utilisation db

db.collection.createIndex({ <location field> : "2dsphere" }) 

pour plus perfer https://docs.mongodb.com/manual/geospatial-queries/

+0

Échec. Erreur mentionnée ci-dessus dans UPDATE 2 – jdog

+0

Oh, vous devez également créer l'indexation géographique sur le terrain pour lequel vous voulez utiliser $ geoNear – Shubham

+0

Je vais mettre à jour ma réponse – Shubham