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

execute mongo aggregation query using dotnet driver

我需要在 dotnet 应用程序上执行此查询 mongo。 查询 return 很多文档。

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

我试过了,但是 returns 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();

这里的问题是您错误地为 $group 阶段定义了 _id。 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" }