C#中的MongoDB聚合函数

时间:2016-04-04 09:46:19

标签: c# mongodb mongodb-.net-driver

我试图在使用聚合功能后显示/列出数据,但它没有发生。

这段代码非常合适。

        var connectionstring = "mongodb://localhost:27017";
        var client = new MongoClient(connectionstring);
        var db = client.GetDatabase("school");
        var col = db.GetCollection<BsonDocument>("students");
        var filter = new BsonDocument("type", "homework");
        var filter2 = Builders<BsonDocument>.Filter.Eq("scores.type", "homework");

        var myresults = await col.Find(filter2)
            .Limit(2)
            .Project("{name:1,scores:1,_id:0}")
            .Sort("{score:1}")
            .ToListAsync();

        foreach (var result in myresults)
        {
            Console.WriteLine(result);
        }

当我替换

时,此代码将按原样提取文档
 var myresults = await col.Find(filter2)
            .Limit(2)
            .Project("{name:1,scores:1,_id:0}")
            .Sort("{score:1}")
            .ToListAsync();

用这个

            var myresults = await col.Aggregate()
            .Unwind("{$scores}")
            .Group(new BsonDocument { { "_id", "$_id" }, { "lowscore", new BsonDocument("$min", "$scores.score") } })
            //.Group("{_id:'$_id',lowscore:{$min:'$scores.score'}}")
            .ToListAsync();

没有记录。 我不想使用Pipeline方法。我只想显示通过聚合函数获得的结果。

这是我的Mongo查询(我想在C#中获得与此相同的结果) -

db.students.aggregate([{$sort:{_id:-1}},{$unwind:"$scores"},{$group:{_id:"$_id", lowscore:{"$min":"$scores.score"}}}])

3 个答案:

答案 0 :(得分:2)

这是错误的...... {$scores}甚至不是有效的json。从$unwind指令中删除花括号和美元符号。

参数名称是字段,因此您需要为其提供字段名称。

答案 1 :(得分:0)

尝试只写$ score而不是@ scores.score。可能会有所帮助。

db.students.aggregate([{$sort:{_id:-1}},{$unwind:"$scores"},{$group:{_id:"$_id", lowscore:{"$min":"$score"}}}])

答案 2 :(得分:0)

构建聚合管道有点棘手。

尝试:

var pipeline = new BsonDocument[] {
    new BsonDocument{ { "$sort", new BsonDocument("_id", 1) }},
    new BsonDocument{{"$unwind", "$scores"}},
    new BsonDocument{{"$group", new BsonDocument{
                {"_id", "$_id"},
                {"lowscore",new BsonDocument{
                        {"$min","$scores.score"}}
                }}
        }}
};

var result = collection.Aggregate<BsonDocument> (pipeline).ToListAsync();

如果您执行pipeline.ToJson(),您将获得以下JSON等效字符串,该字符串与您原始且经过测试的MongoShell查询相同。

[
    {
        "$sort": {
            "_id": 1
        }
    },
    {
        "$unwind": "$scores"
    },
    {
        "$group": {
            "_id": "$_id",
            "lowscore": {
                "$min": "$scores.score"
            }
        }
    }
]