C#MongoDb直接从JSON运行聚合查询

时间:2018-02-23 22:48:22

标签: c# mongodb

我正在研究一种可以从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说我需要传递一个管道定义,我找不到如何使用的好例子。

2 个答案:

答案 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驱动程序文档页面:

Definitions and Builders

在主题中,PIPELINE有一个可以帮助你的简单例子。 您需要创建一个简单的代码才能使用管道定义。

PipelineDefinition pipeline = new BsonDocument[] 
{
    new BsonDocument { { "$match", new BsonDocument("x", 1) } },
    new BsonDocument { { "$sort", new BsonDocument("y", 1) } }
};

col.aggregate(pipeline);

希望这有帮助!