MongoDB Геопространственная индексация стога сена - PullRequest
1 голос
/ 29 сентября 2011

Как создать индекс геопространственного сена , используя драйвер 10gen C # для MongoDB

JS Пример:

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

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

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: Safemode обнаружил ошибку «может иметь только 1 индексный плагин / неправильный шаблон ключа индекса». (Ответ был {"err": "может иметь только 1 индексный плагин / неверный шаблон ключа индекса", "code": 13007, "n": 0, "connectionId": 6, "ok": 1.0}).

Так что, если я удалю клавишу 'type', вот так:

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: Safemode обнаружил ошибку «другие поля не указаны». (Ответ был {"err": "другие поля не указаны", "code": 13317, "n": 0, "connectionId": 7, "ok": 1.0}).

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

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

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

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

 keys.Add("type", 1);

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

1 голос
/ 29 сентября 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);
...