Mongodb / C# - 如何进行边界框查询?

时间:2012-02-09 18:15:59

标签: c# mongodb mongodb-.net-driver nosql

每个标题 - 我正在使用官方的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”:   “类型中的未知$:0”,“代码”:13058})。

2 个答案:

答案 0 :(得分:7)

您的代码中的问题是您没有指定要使用的地理位置操作。您只指定了$within,但错过了where。您必须指定$within以及$box(边界框),$polygon$center$centerSphere / $nearSphere

这是运行$box查询

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

我不确定c#mongodb语法。但是,如果你包含&#39; $ box&#39;,它将会工作

答案 1 :(得分:4)

您还可以使用“查询”构建器来执行此查询:

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

让查询构建器担心创建正确形式的查询的细节。