C#mongo使用json字符串查询
这看起来很基本,我确信我只是忽略了某个地方的某个阶级或方法,但对于我的生活,我找不到它。
我有一个像这样的json字符串:
{ SendId: 4, "Events.Code" : { $all : [2], $nin : [3] } }
我可以在mongo shell中对find()
或count()
运行它,并得到我正在寻找的东西。 在C#中处理这个问题最简单的方法是什么? 这是我发现的:
- 我发现的方法都想要一个
IMongoQuery
,它只是一个标记接口 -
BsonDocument
有一个很好的Parse方法,但它没有实现IMongoQuery
-
QueryDocument
inheritance自BsonDocument
,它确实实现了IMongoQuery
,但它没有自己的Parse方法,我无法将QueryDocument
转换为BsonDocument
- Aggregation框架采用
BsonDocument
[],但有时我只想要一个简单的Find或Count操作 - 其中一些查询很大且很粗糙,我不想在
Query
构建器类中一次构建它们
如果数据库处理json文档,并且我可以在shell中运行这些东西,是不是有某种方法可以通过驱动程序运行它?
这很难看,但你可以通过将字符串反序列化为BsonDocument
然后包装在QueryDocument
中来实现这QueryDocument
BsonDocument query = MongoDB.Bson.Serialization.BsonSerializer.Deserialize("{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }"); QueryDocument queryDoc = new QueryDocument(query); var result = collection.FindAs(queryDoc); // or just use Find
如果您经常计划这样做,您可以始终将其包装在方法中,或者创建如下所示的JSQueryDocument
类:
public class JSQueryDocument : QueryDocument { public JSQueryDocument(string query) : base(MongoDB.Bson.Serialization.BsonSerializer.Deserialize(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.Parse
与QueryDocument
一起实现完全相同的目标有一个更QueryDocument
:
var json = "{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }"; collection.Find(new QueryDocument(BsonDocument.Parse(json)));