我执行以下查询:
{
$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数据库中保持字符串格式,所以我需要序列化/反序列化它。
答案 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查询语言。最好对他们明确允许做的事情进行建模。