Я бил головой об этом один в течение нескольких дней. У меня очень простой запрос, который я пытаюсь запустить на С#, он выглядит так в оболочке.
db.runCommand({geoNear: "items", near: {type: "Point", coordinates : [-111.283344899999, 47.4941836]}, spherical : true, distanceMultiplier: 3963.2, maxDistance : 25});
Моя коллекция выглядит как
{
"_id" : ObjectId(),
"Title" : "arst",
"Description" : "<p>arst</p>",
"Date" : new Date("11/29/2015 09:28:15"),
"Location" : {
"type" : "Point",
"Coordinates" : [-111.28334489999998, 47.4941836]
},
"Zip" : "59405"
}
В соответствии с документами MongoDB С# API Docs объект MongoDB.Driver.Builders.Query теперь устарел. Поэтому, когда я делаю что-то вроде этого
var point = new GeoJson2DGeographicCoordinates(double.Parse(longitude), double.Parse(latitude)) ;
var query = Query<Item>.Near(x => x.Location, new GeoJsonPoint<GeoJson2DGeographicCoordinates>(point), distance, true);
var result = collection.Find(query);
Компилятор жалуется, что он не может конвертировать из IMongoQuery в FilterDefinition. Это говорит мне, что унаследованный Query < > builder не поддерживается новой библиотекой 2.1. Но для жизни меня я не могу найти нигде в api docs, ссылающихся на замену?
Может ли кто-нибудь указать мне в правильном направлении на выполнение этого простого геопространственного запроса в драйвере 2.1 С#? Я в тупике.
Кроме того, у меня есть индекс 2dsphere, созданный в коллекции, если бы я не выполнял команду оболочки. Здесь вывод индекса.
{
"v" : 1,
"key" : {
"Location.Coordinates" : "2dsphere"
},
"name" : "Location.Coordinates_2dsphere",
"ns" : "ppn.items",
"2dsphereIndexVersion" : 2
}
ИЗМЕНИТЬ
После того, как я раскопал TON документации, я нашел его. Все примеры по-прежнему показывают унаследованный метод Query < > , но кажется, что новый метод является частью пространства имен Builders < > . Filter. Так что этот блок кода работает для меня,
double lng = double.Parse(longitude);
double lat = double.Parse(latitude);
point = new GeoJson2DGeographicCoordinates(lng, lat);
pnt = new GeoJsonPoint<GeoJson2DGeographicCoordinates>(point);
dis = distance * 1609.34;
fil = Builders<Item>.Filter.NearSphere(p => p.Location.Coordinates, pnt, dis);
filter = filter & fil;
var sort = Builders<Item>.Sort.Descending("Date");
// This is the actual query execution
List<Item> items = collection.Find(filter).Sort(sort).ToListAsync().Result;
Этот кодовый блок очень грязный, это результат попытки и сбой снова и снова. Я уверен, что я выясню способы его очистки. Мне кажется немного подробным, что вам нужно создать GeoJsonPoint из GeoJson2DGeographicCoordinates, но я уверен, что для этого есть веская причина. Если кто знает, пожалуйста, не стесняйтесь комментировать. Любые предложения по улучшению этого ответа очень приветствуются, это разочаровывает процесс документирования, поэтому, надеюсь, это поможет указать кому-то в правильном направлении.