Mongo DB / C # - Как сделать ограничивающий прямоугольник запросов? - PullRequest
2 голосов
/ 09 февраля 2012

За заголовок - я использую официальный драйвер mongodb и ищу все POI в пределах указанного ограничивающего прямоугольника.

Пока у меня есть:

MongoCollection<BsonDocument> collection = _MongoDatabase.GetCollection("pois");

BsonArray lowerLeftDoc = new BsonArray(new[] { lowerLeft.Lon, lowerLeft.Lat});
BsonArray upperRightDoc = new BsonArray(new[] { upperRight.Lon, upperRight.Lat});

BsonDocument locDoc = new BsonDocument 
{
   { "$within", new BsonArray(new[] { lowerLeftDoc, upperRightDoc})}
};

BsonDocument queryDoc = new BsonDocument { { "loc", locDoc }};

IList<TrafficUpdate> updates = new List<TrafficUpdate>();
var results = collection.Find(new QueryDocument(queryDoc)).SetLimit(limit);
foreach (BsonDocument t in results)
{
} 

К сожалению, это не работает. Я получаю:

Флаг QueryFailure был неизвестен $ внутри типа: 0 (ответ был {"$ err": "unknown $ внутри типа: 0", "code": 13058}).

Ответы [ 2 ]

7 голосов
/ 09 февраля 2012

Проблема в вашем коде в том, что вы не указали, какую гео-операцию вы хотите использовать.Вы только указали $within, но пропустили where.Вы должны указать $within вместе с $box (ограничивающий прямоугольник), $polygon, $center или $centerSphere / $nearSphere.

Это правильный синтаксис монго для выполнения запросов $box

> box = [[40.73083, -73.99756], [40.741404,  -73.988135]]
> db.places.find({"loc" : {"$within" : {"$box" : box}}})

Я не уверен в синтаксисе c # mongodb.Но если вы включите '$ box', он будет работать

4 голосов
/ 09 февраля 2012

Вы также можете использовать построитель запросов для этого запроса:

var query = Query.Within("loc", lowerLeft.Lon, lowerLeft.Lat,
    upperRight.Lon, upperRight.Lat);

и позвольте построителю запросов беспокоиться о мельчайших подробностях создания правильно сформированного запроса.

...