2015-01-07 1 views
0

Это моя мангуст схема -Как добавить еще некоторые ограничения, с geoNear

var userDestinationSchema = mongoose.Schema({ 

    uid: String,     
    update_time: Date,   
    some_data: String, 

    location:{     //<INDEXED as 2d> 
     lon: Number, 
     lat: Number 
    } 
}); 



var userDestinationModel = mongoose.model('userDestinationModel', userDestinationSchema); 

Чтобы запросить модель geoNear, я это делаю.

userDestinationModel.geoNear(lng, lat, { maxDistance : 1.5 }, 
       function(err, results, stats) { 
        console.log(results); 
       }); 

Как добавить еще некоторые ограничения, например, при определенном значении some_data?

ответ

1

«Лучший способ» заключается в использовании оператора $near или $nearSphere по мере необходимости. Метод mongoose .geoNear() использует более старый geoNear command MongoDB. Остальные операторы играют лучше с другими операторами запроса в последних версии:

userDestinationModel.find({ 
    "location": { 
     "$near": [ lng, lat ], 
     "$maxDistance": 1.5 
    }, 
    "update_time": { "$gt": new Date("2015-01-01") } 
},function(err,result) { 

}); 

Вы также можете использовать рамочную агрегацию форму $geoNear. Это имеет собственный вариант «запрос», чтобы указать дополнительную информацию:

userDestinationModel.aggregate(
    [ 
     { "$geoNear": { 
      "near": [ lng, lat ], 
      "maxDistance": 1.5, 
      "distanceField": "distance", 
      "query": { 
       "update_time": { "$gt": new Date("2015-01-01") } 
      } 
     }} 
    ], 
    function(err,result) { 

    } 
); 

И что позволяет другие варианты, а также быть так же, как "command form", где он выступает и дополнительные «distanceField» в результатах, которые вы могли бы использовать для позже сортировка или фильтрация или что-то еще.

Вы также должны быть в состоянии определить «запрос» в качестве опции к методу мангустов:

userDestinationModel.geoNear(lng, lat, 
    { 
     "maxDistance" : 1.5, 
     "query": { 
      "update_time": { "$gt": new Date("2015-01-01") } 
     } 
    }, 
    function(err, results, stats) { 
     console.log(results); 
    }); 

Но как личное предпочтение я бы для новых операторов, если у вас есть зависимость от более старой версии сервера поддержка.

Также попытайтесь отойти от старых координирующих пар и к GeoJSON, так как он намного более совместим с другими API, с которыми вы, вероятно, будете работать в обмене данными, а также с поддержкой более широкого разнообразия типов GeoJSON. Имейте в виду, что если вы перейдете на GeoJSON, параметры, такие как «maxDistance», и пройденное расстояние будут измеряться «метрами», а не «радианами», как в случае с устаревшими координатами.

Смежные вопросы