C#mongo使用json字符串进行查询

本文关键字:查询 字符串 使用 json C#mongo | 更新日期: 2023-09-27 18:19:28

这似乎很基本,我确信我只是在某个地方忽略了一个类或方法,但就我而言,我找不到它。

我有一个json字符串,如下所示:

{ SendId: 4, "Events.Code" : { $all : [2], $nin : [3] } }

我可以在mongo shell中针对find()count()运行它,并获得我想要的内容。在C#中处理这个问题最简单的方法是什么?以下是我的发现:

  • 我发现的方法都需要一个IMongoQuery,它只是一个标记接口
  • BsonDocument有一个不错的Parse方法,但它没有实现IMongoQuery
  • QueryDocument继承自BsonDocument,它确实实现了IMongoQuery,但它没有自己的Parse方法,我无法将QueryDocument转换为BsonDocument
  • Aggregation框架采用BsonDocument[],但有时我只想要一个简单的Find或Count操作
  • 其中一些查询很大而且很粗糙,我不想用Query构建器类一次构建一行

如果数据库处理json文档,并且我可以在shell中运行这些东西,难道没有办法通过驱动程序运行它吗?

C#mongo使用json字符串进行查询

这很难看,但您可以通过将字符串反序列化为BsonDocument,然后包装为QueryDocument 来实现这一点

BsonDocument query = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>("{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }");
QueryDocument queryDoc = new QueryDocument(query);
var result = collection.FindAs<TypeOfResultExpected>(queryDoc); // or just use Find

如果这是你计划经常做的事情,你可以总是把它包装在一个方法中,或者创建一个JSQueryDocument类,如下所示:

public class JSQueryDocument : QueryDocument
{
    public JSQueryDocument(string query) : base(MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(query))
    {
        // Probably better to do this as a method rather than constructor as it
        // could be hard to debug queries that are not formatted correctly
    }
}
/// ...
var result = collection.Find(new JSQueryDocument("{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }"));

为了补充Shaun McCarthy的答案,有一种稍微干净一点的方法可以使用BsonDocument.ParseQueryDocument来实现完全相同的目标:

var json = "{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }";
collection.Find(new QueryDocument(BsonDocument.Parse(json)));