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
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. –
J'ai mis à jour pour illustrer ce que je cherche. – jdog
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'. –