Конвертировать конвейер агрегации Mongodb в C # .Net Core - PullRequest
0 голосов
/ 18 сентября 2018

Возможно, кто-то может помочь мне с проблемой преобразования запроса агрегации mongodb в C # с помощью драйвера mongodb .Net.

В соответствии с моей проблемой здесь Я пытался преобразовать следующеена C #

db.getCollection('test').aggregate([
    { "$facet": {
        "allInRoot1": [{
            "$match": { "rootReferenceId": LUUID("9f3a73df-bca7-48b7-b111-285359e50a02") }
        }],
        "allInRoot2": [{
            "$match": { "rootReferenceId": LUUID("27f2b4a6-5471-406a-a39b-1e0b0f8c4eb9") }
        }]
    }},
    { "$project": {
        "difference": {
            "$filter": {
                "input": "$allInRoot1",
                "as": "this",
                "cond": { "$in": [ "$$this.reference.id", { "$setDifference": [ "$allInRoot1.reference.id", "$allInRoot2.reference.id" ] } ] }
            }
        }
    }}
])

Пока у меня есть это

        var matchFilterOne = new ExpressionFilterDefinition<NodeModel>(node => node.RootReferenceId == baseId);
        var matchStageOne  = PipelineStageDefinitionBuilder.Match(matchFilterOne);
        var pipelineOne = PipelineDefinition<NodeModel, NodeModel>.Create(new IPipelineStageDefinition[] { matchStageOne });

        var matchFilterTwo = new ExpressionFilterDefinition<NodeModel>(node => node.RootReferenceId == idToExclude);
        var matchStageTwo = PipelineStageDefinitionBuilder.Match(matchFilterTwo);
        var pipelineTwo = PipelineDefinition<NodeModel, NodeModel>.Create(new IPipelineStageDefinition[] { matchStageTwo });

        var facetPipelineOne = AggregateFacet.Create("allInRoot1", pipelineOne);
        var facetPipelineTwo = AggregateFacet.Create("allInRoot2", pipelineTwo);
        var test = testCollection.Aggregate()
            .Facet(facetPipelineOne, facetPipelineTwo)
            /* This seems to fail because the facet structure is wrong and it can't access the $allInRoot1 field ...

            .Project(@"{
                'difference': {
                    '$filter': {
                        'input': '$allInRoot1',
                        'as': 'this',
                        'cond': {
                            '$in': [ '$$this.reference.id', { '$setDifference': [ '$allInRoot1.reference.id', '$allInRoot2.reference.id' ] }]
                        }
                 }}}")
            */
        .FirstOrDefault();

Возможно, у кого-то есть подсказка, указывающая мне в правильном направлении?Можно ли использовать проекцию с типами?

Любая помощь приветствуется!

...