首页 > 解决方案 > 无法从字符串反序列化管道阶段

问题描述

我在这样的字符串上有一个 mongodb 聚合管道阶段:

{ $project: { 
    txtStatus: { $trim: { input: '$txtStatus' } } 
} },            
{ $match: {$or: [{'txtStatus': {$eq: 'VALID'}},{'txtStatus': {$eq: 'NOTVALID'}}]} },
{ $group: {
    _id: '$txtStatus',
    Count: { $sum: 1 }
} }

我目前需要分离每个阶段并像这样一一追加:

_myRepo.SetDatabase("MyDbName")
    .GetCollection("MayColl")
    .Aggregate<dynamic>()
    .AppendStage<dynamic>(stageProject.ToBsonDocument())
    .AppendStage<dynamic>(stageMatch.ToBsonDocument())
    .AppendStage<dynamic>(stageGroup.ToBsonDocument());

我需要将整个字符串传递给“AppendStage”,而不必像我今天所做的那样将它分成多个阶段,如下所示:

_myRepo.SetDatabase("MyDbName")
    .GetCollection("MayColl")
    .Aggregate<dynamic>()
    .AppendStage<dynamic>(myEntireAggregationString.ToBsonDocument());

标签: c#mongodbaggregation-framework

解决方案


我把我的查询放在括号内:

[
    { $project: { 
        txtStatus: { $trim: { input: '$txtStatus' } } 
    } },            
    { $match: {$or: [{'txtStatus': {$eq: 'VALID'}},{'txtStatus': {$eq: 'NOTVALID'}}]} },
    { $group: {
        _id: '$txtStatus',
        Count: { $sum: 1 }
    } }
]

然后,我将查询反序列化为 BsonDocument 数组,并在 Aggregate() 方法中传递此数组/列表:

var pipelineStages = BsonSerializer.Deserialize<BsonDocument[]>(myQuery).ToList();

var ret = _myRepo.SetDatabase("MyDbName")
    .GetCollection("MayColl")
    .Aggregate<dynamic>(pipelineStages)
    .ToList();

推荐阅读