Używam modułu node-geoip i wykonuję kwerendę agregacji. Schemat przeciwko której jestem wykonywania kwerendy wygląda następująco:MongoDB/Mongoose - Agregacja z geoNear i podokumentami
var mongoose = require('mongoose');
require('./location.js');
module.exports = mongoose.model('Region',{
attr1: Number,
attr2: String,
attr3: String,
locations:[mongoose.model('Location').schema]
});
i
var mongoose = require('mongoose');
module.exports = mongoose.model('Location',{
attr1: Number,
latlong: { type: [Number], index: '2d' },
});
trzeba wykonać operację $ geoNear w zapytaniu agregacji, ale biegnę na kilka problemów . Po pierwsze, tutaj jest moja metoda agregacji:
var region = require('../models/region');
var geo = geoip.lookup(req.ip);
region.aggregate([
{$unwind: "$locations"},
{$project: {
attr1 : 1,
attr2 : 1,
locations : 1,
lower : {"$cond" : [{$lt: [ '$locations.attr1', '$attr1']}, 1, 0]}
}},
{
$geoNear: {
near: { type:"Point", '$locations.latlong': geo.ll },
maxDistance: 40000,
distanceField: "dist.calculated"
}
},
{ $sort: { 'locations.attr1': -1 } },
{$match : {lower : 1}},
{ $limit: 1 }
], function(err,f){...});
Pierwszym problemem Dostaję jest to, że najwyraźniej geoNear musi być w pierwszym etapie rurociągu: exception: $geoNear is only allowed as the first pipeline stage
. Moje pytanie brzmi: czy mogę przeprowadzić wyszukiwanie geoNear w subdokumentach bez ich rozwijania? Jeśli tak to jak?
Drugi komunikat o błędzie, który dostaję, to errmsg: \"exception: 'near' field must be point\"
. Co to znaczy i co oznacza dla mojego kodu? Próbowałem za pomocą near
jak:
near: { type:"Point", '$locations.latlong': geo.ll },
Czy próbowałeś zdefiniować "blisko" jako punkt? Na przykład; w pobliżu: [długość geograficzna, szerokość geograficzna], – cdagli
Indeksy na tablicach są wielostronicowe. '$ GeoNear' powinno działać poprawnie na macierzy - porządek powinien być najbliższy punktowi w każdym dokumencie. Drugi błąd mówi, że nie używasz '$ geoNear' z właściwą składnią. Sprawdź ['$ geoNear'] (http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/), w szczególności przykłady na dole. – wdberkeley
@wdberkeley Dzięki za odpowiedź. Kiedy mówisz "zamawianie powinno być najbliższym punktem w każdym dokumencie", co masz na myśli? Naprawdę nie rozumiem, co to oznacza dla mojego kodu? Czy to oznacza, że mogę przenieść '$ geoNear' na pierwszy etap przed rozwinięciem' $ locations'? – Jordan