C # & MongoDb 2.0 - проблема NearSphere - PullRequest
0 голосов
/ 01 мая 2019

В настоящее время я работаю над MongoDB с C # , и мне было интересно, как работает около / geoNear в .NET.Я мог бы заставить его работать в go , но я борюсь с C #

In go У меня есть следующее:

var addresses []*models.Address
bson.M{
    "location": bson.M{
        "$near": bson.M{
            "$geometry": bson.M{
                "type":        "Point",
                "coordinates": []float64{ in.Area.Longitude, in.Area.Latitude },
            },
            "$maxDistance": in.Area.Scope,
        },
    },
}, &addresses)

Теперь в C # у меня есть следующее:

var options = new FindOptions<SchoolDataModel> { Limit = 10 }; // Just because I wanna limit to 10 results
var filter = NewFilterBuilder().NearSphere(s => s.Location, in.Area.Longitude, in.Area.Latitude);
return await (await GetCollection<AddressDataModel>().FindAsync(filter, options)).ToListAsync();

Затем я получаю следующее:

"ExceptionMessage": "Команда findСбой: ошибка при обработке запроса: ns = eyesapp.SchoolDataModel limit = 9Tree: GEONEAR field = Location maxdist = 1.79769e + 308 isNearSphere = 1 \ nSort: {} \ nProj: {} \ n возвращена ошибка планирования: не удалось найти индекс для $запрос geoNear. "

Я знаю, что в go Мне пришлось создать индекс, поэтому я пытался сделать то же самое в C # :

await GetMongoDatabase()
    .GetCollection<AddressDataModel>(typeof(AddressDataModel).Name)
    .Indexes.CreateOneAsync(new CreateIndexModel<AddressDataModel>(Builders<AddressDataModel>.IndexKeys.Geo2DSphere(x => x.Location)));

Однако я получаю следующее исключение при запуске моего приложения ASP.NET при попытке создания моего индекса:

{"Команда createIndexes завершилась неудачно: не удается извлечь географические ключи: {_id: ObjectId....}. "}


К концу я хочу добиться того, чтобы, как и в Go , можно было найти адреса рядом с заданным местоположением,с мамойМаксимальное расстояние, но также с предопределенным пределом, таким как 10, 20 или 50.

Спасибо за любую помощь

1 Ответ

1 голос
/ 02 мая 2019

Оказывается, все было хорошо, кроме хранилища самой локации.В моей модели данных у меня было следующее:

public class Location
{
    public double Latitude { get; set; }

    public double Longitude { get; set; }
}

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

public class Location
{
    [BsonElement("type")]
    public string Type { get; } = "Point";

    [BsonElement("coordinates")]
    public double[] Coordinates { get; set; } = new double[2] { 0.0, 0.0 };

    public double Latitude
    {
        get => Coordinates[1];
        set => Coordinates[1] = value;
    }

    public double Longitude
    {
        get => Coordinates[0];
        set => Coordinates[0] = value;
    }
}

Надеюсь, это поможет:)

Макс

...