【问题标题】:MongoDb c# bad unknown operator exceptionMongoDb c# 错误的未知运算符异常
【发布时间】:2015-06-19 08:58:07
【问题描述】:

我执行以下查询:

{
    $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 标志为真(响应为 { \"$err\" : \"Can't canonicalize query: BadValue unknown top level operator: $query\", \"code \" : 17287 })."}

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

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

【问题讨论】:

  • 可能是因为您的查询字符串包含未转义的引号?
  • 我已将 \" 替换为 " ' " ,但没有帮助

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


【解决方案1】:

这不是一个有效的查询。虽然您可以通过这种方式添加 $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,我想你会发现它非常有问题。正确使用索引是不可能的,因为您的“用户”绝对可以做他们想做的任何事情。此外,您还要求他们了解 MongoDB 查询语言。最好明确地对他们被允许做的事情进行建模。

【讨论】:

  • 非常感谢!这对我很有帮助。
猜你喜欢
  • 2015-01-01
  • 2020-01-17
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2021-03-12
  • 1970-01-01
相关资源
最近更新 更多