MongoDb c# 错误的未知运算符异常

MongoDb c# bad unknown operator exception

我执行以下查询:

{
    $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] = {"QueryFailure flag was true (response was { \"$err\" : \"Can't canonicalize query: BadValue unknown top level operator: $query\", \"code\" : 17287 })."}

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

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

这不是一个有效的查询。虽然您可以通过这种方式添加 $orderby(但不推荐这样做),但 skip 和 limit 不是文档的一部分。最好的办法是不要尝试以这种方式构建它,而是让驱动程序为您构建它。这也将使您的应用程序在未来证明服务器何时更改查询的发出方式 (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,我认为您会发现它非常有问题。正确使用索引是不可能的,因为你的 "users" 可以做任何他们想做的事情。另外,您要求他们了解 MongoDB 查询语言。明确允许他们做什么会更好。