Геопространственная индексация стога сена MongoDB

Как создать геопространственный индекс Haystack с помощью драйвера C# 10gen для MongoDB

Пример JS:

db.foo.ensureIndex({ pos : "geoHaystack", type : 1 }, { bucketSize : 1 })

Пример С#, который не работает:

BsonDocument keys = new BsonDocument();
keys.Add("pos", "geoHaystack");
keys.Add("type", "1");

IMongoIndexKeys indexKeys = new IndexKeysDocument(keys);

IndexOptionsDocument indexOptions = new IndexOptionsDocument("bucketSize", new BsonInt32(1));

collection.CreateIndex(indexKeys, indexOptions);

Выдает эту ошибку:

MongoDB.Driver.MongoSafeModeException: безопасный режим обнаружил ошибку «может иметь только 1 подключаемый модуль индекса/неверный шаблон ключа индекса». (Ответ был { "err": "может быть только 1 плагин индекса/неправильный шаблон ключа индекса", "code" : 13007, "n" : 0, "connectionId" : 6, "ok": 1.0 }).

Итак, если я удалю ключ «тип», например:

BsonDocument keys = new BsonDocument();
keys.Add("pos", "geoHaystack");

IMongoIndexKeys indexKeys = new IndexKeysDocument(keys);

IndexOptionsDocument indexOptions = new IndexOptionsDocument("bucketSize", new BsonInt32(1));

collection.CreateIndex(indexKeys, indexOptions);

Я получаю эту ошибку:

MongoDB.Driver.MongoSafeModeException: безопасный режим обнаружил ошибку «другие поля не указаны». (Ответ был { "ошибка": "другие поля не указаны", "код": 13317, "n": 0, "connectionId": 7, "ok": 1.0}).


person Robert    schedule 28.09.2011    source источник


Ответы (2)


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

 keys.Add("type", "1");

Измените его на целое

 keys.Add("type", 1);

Это будет работать так, как ожидалось

person RameshVel    schedule 30.09.2011

У меня это работает с:

IMongoIndexKeys keys = new IndexKeysDocument {
    { "Position", "geoHaystack" },
    { "type", 1 }
};

IMongoIndexOptions options = new IndexOptionsDocument {
    { "bucketSize", 1 }
};

collection.EnsureIndex(keys, options);

Проблема, с которой я столкнулся, заключалась в том, что данные уже были загружены в коллекцию.

Затем вы должны иметь возможность запрашивать с помощью:

var command = new CommandDocument {
    { "geoSearch", "foo" },
    { "near", new BsonArray { 33, 33 } },
    { "maxDistance", 6 },
    { "search", new BsonDocument { { "type", "restaurant" } } },
    { "limit", 30 }
};
database.RunCommand(command);
person Robert    schedule 29.09.2011