我正在研究一种可以从json输入运行mongodb聚合查询的服务方法。我们的想法是,您将使用Builders生成查询,将该查询转换为json,将其传递给要反序列化并运行的服务。对于查找查询,我能够使用像这样的Bson文档
public string DoGenericFind(string queryDoc, string collectionName)
{
BsonDocument document = BsonSerializer.Deserialize<BsonDocument>(queryDoc);
var results = _context.Database.GetCollection<dynamic>(collectionName).FindSync<BsonDocument>(document);
if (results == null)
return null;
else
return results.ToList().ToJson();
}
我无法通过聚合找到类似的方法。我发现的唯一例子是尝试做类似于this的事情,他们传递了某种BsonDocument []。但是,我的驱动程序版本(2.5)的intellisense说我需要传递一个管道定义,我找不到如何使用的好例子。
答案 0 :(得分:2)
发布后立即找到一个很好的例子。 https://groups.google.com/forum/#!topic/mongodb-user/Otg17LUE_7M
这使我的最终解决方案看起来像
public string DoGenericAggregate(string queryDoc, string collectionName)
{
var query = BsonSerializer.Deserialize<BsonDocument[]>(queryDoc).ToList();
List<BsonDocument> list;
using (var cursor = _context.Database.GetCollection<dynamic>(collectionName).Aggregate<BsonDocument>(query))
{
list = cursor.ToList();
}
if (list == null)
return null;
else
return list.ToJson();
}
我很确定我有类似于此的疯狂但却出错了。但无论如何,List<BsonDocument>
可隐式转换为PipelineDefinition<,>
,因此可以传递给聚合函数。
答案 1 :(得分:2)
请查看此MongoDB驱动程序文档页面:
在主题中,PIPELINE有一个可以帮助你的简单例子。 您需要创建一个简单的代码才能使用管道定义。
PipelineDefinition pipeline = new BsonDocument[]
{
new BsonDocument { { "$match", new BsonDocument("x", 1) } },
new BsonDocument { { "$sort", new BsonDocument("y", 1) } }
};
col.aggregate(pipeline);
希望这有帮助!