C#mongo使用json字符串查询

Lov*_*ode 12 .net c# json mongodb mongodb-.net-driver

这看起来很基本,我确信我只是忽略了一个阶级或某个方法,但对于我的生活,我找不到它.

我有一个像这样的json字符串:

{ SendId: 4, "Events.Code" : { $all : [2], $nin : [3] } }
Run Code Online (Sandbox Code Playgroud)

我可以在mongo shell中对抗a find()或a 来运行它count()并得到我正在寻找的东西.在C#中处理这个问题最简单的方法是什么?这是我发现的:

  • 我找到的方法都想要一个IMongoQuery,这只是一个标记界面
  • BsonDocument 有一个很好的Parse方法,但它没有实现 IMongoQuery
  • QueryDocument继承自BsonDocument,它确实实现IMongoQuery,但它没有自己的Parse方法,我无法将其转换QueryDocumentBsonDocument
  • 聚合框架采用BsonDocument[],但有时我只想要一个简单的查找或计数操作
  • 其中一些查询很大且很粗糙,我不想在构建Query器类中一次构建它们

如果数据库处理json文档,并且我可以在shell中运行这些东西,是不是有某种方法可以通过驱动程序运行它?

Sha*_*thy 17

这很丑陋,但你可以通过将字符串反序列化为a 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
Run Code Online (Sandbox Code Playgroud)

如果您计划经常进行此操作,则可以始终将其包装在方法中,或者创建如下所示的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] } }"));
Run Code Online (Sandbox Code Playgroud)

  • BsonDocument.Parse()会更好吗?! (2认同)

i3a*_*non 12

要添加到肖恩·麦卡锡的回答有一个稍微更清洁的方式使用,以实现精确的同一个目标BsonDocument.Parse一起QueryDocument:

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

  • QueryDocument 已在 MongoDB.Driver 2.5.0.0 中删除。有没有另一种方法可以从 json 格式的查询中查找? (3认同)
  • 聚合可以完成相同的操作吗? (2认同)