使用dotnet驱动程序执行mongo聚合查询

时间:2019-02-26 13:45:35

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

我需要在dotnet应用程序上执行此查询mongo。 该查询返回许多文档。

db.mycollection.aggregate(
[  
    { $match : { tipo:"user_info" } } ,
    {$group: { 
         _id: {userKey: "$userKey", appId:"$appId"} ,
         uniqueIds: {$addToSet: "$_id"},
         count: {$sum: 1}
        }
        },
    {$match: { 
        count: {"$gt": 1}
        }
    }
]);

我尝试了此操作,但它返回了0个文档。

var result = collection.Aggregate()
            .AppendStage<BsonDocument>
            (
                new BsonDocument { { "$match", new BsonDocument("tipo", "user_info") } }
            )
            .AppendStage<BsonDocument>
            (
                new BsonDocument { { "$group", new BsonDocument("_id", "{userKey: \"$userKey\", appId:\"$appId\"}")
                .Add("uniqueIds", new BsonDocument("$addToSet", "$_id"))
                .Add("count", new BsonDocument("$sum", "1"))} }
            )
            .AppendStage<BsonDocument>
            (
                new BsonDocument { { "$match", new BsonDocument("count", new BsonDocument("$gt", 1)) } }
            ).ToList();

1 个答案:

答案 0 :(得分:0)

这里的问题是您为_id阶段错误地定义了$group。 MongoDB驱动程序将其解释为字符串:

{ "$group" : { "_id" : "{userKey: \"$userKey\", appId:\"$appId\"}", "uniqueIds" : { "$addToSet" : "$_id" }

要解决此问题,您可以嵌套另一个BsonDocument,例如:

.AppendStage<BsonDocument>
        (
            new BsonDocument { { "$group", new BsonDocument("_id",
                new BsonDocument() { { "userKey", "$userKey" }, { "appId", "$appId" } })
            .Add("uniqueIds", new BsonDocument("$addToSet", "$_id"))
            .Add("count", new BsonDocument("$sum", 1))} }
        )

将被翻译为:

{ "$group" : { "_id" : { "userKey" : "$userKey", "appId" : "$appId" }, "uniqueIds" : { "$addToSet" : "$_id" }