MongoDb c#bad unknown operator exception

时间:2015-06-19 08:58:08

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

我执行以下查询:

{
    $query : { 
        "userId" : 11851, "p2l.listId" : 38882, "isDeleted" : false 
    },       
    $orderby: { email: 1},  
    $skip: 0, 
    $limit:100 
}

通过以下代码:

BsonDocument document = BsonSerializer.Deserialize<BsonDocument>(queryString);
QueryDocument queryDoc = new QueryDocument(document);
var toReturn = collection.Find(queryDoc);
return toReturn.ToList();

我得到以下异常:

  

[MongoDB.Driver.MongoQueryException] = {&#34; QueryFailure标志为真(响应为{\&#34; $ err \&#34;:\&#34;可以规范化查询: BadValue未知的顶级操作符:$ query \&#34;,\&#34; code \&#34;:17287})。&#34;}

我使用MongoDb 3.0和C#驱动程序2.0。

还有其他方法可以执行该查询吗?我需要在sql数据库中保持字符串格式,所以我需要序列化/反序列化它。

1 个答案:

答案 0 :(得分:1)

这不是一个有效的查询。虽然您可以通过这种方式添加$ orderby(但不建议这样做),但跳过和限制不是文档的一部分。最好的办法是不要尝试以这种方式构建它,而是让驱动程序为您构建它。这也将使您的应用程序在服务器更改查询的发布方式(https://jira.mongodb.org/browse/SERVER-15176)时具有前瞻性。

BsonDocument document = BsonDocument.Parse(queryString);
QueryDocument queryDoc = new QueryDocument((BsonDocument)document["$query"]);

return collection.Find(queryDoc)
    .SetSkip((int)document["$skip"])
    .SetLimit((int)document["$limit"))
    .SetSort(new SortDocument((BsonDocument)document["$orderby"]))
    .ToList();

显然,如果其中一些是有条件的,你也需要处理它。

最后一点,如果queryString实际上是一个queryString,我认为你会发现它很有问题。无法正确使用索引,因为您的&#34;用户&#34;可以做任何他们想做的事。另外,您要求他们理解MongoDB查询语言。最好对他们明确允许做的事情进行建模。