Группа MongoDB для C# API - PullRequest
       85

Группа MongoDB для C# API

2 голосов
/ 10 апреля 2020

У меня есть следующая коллекция mongoDB заказов , и мне нужно сгруппировать их в приложении C#:

    [
    {
        _id: 123,
        status: [{
                Detail: 'Started',
                Origin: 'France',
                Last: true
        }]
    },
    {
        _id: 456,
        status: [{
                Detail: 'Received',
                Origin: 'France',
                Last: true
                },{
                Detail: 'Started',
                Origin: 'Italy',
                Last: false
        }]
    },
    {
        _id: 789,
        status: [{
                Detail: 'Started',
                Origin: 'Rome',
                Last: true
        }]
    },
    {
        _id: 123,
        status: [{
                Detail: 'Received',
                Origin: 'Germany',
                Last: true
                },{
                Detail: 'Started',
                Origin: 'Spain',
                Last: false
                }]
    }
    ]

Мне нужно вернуть структуру с последними активными состояниями из эти заказы, сгруппированные по странам и их сумма Последние статусы, что-то вроде этого:

    [
        {
            France: {
                Total: 2,
                Started: 1,
                Received: 1
            },
            Rome: {
                Total: 1,
                Started: 1,
                Received: 0
            },
            Germany: {
                Total: 1,
                Started: 0,
                Received: 1
            }
        }
    ]

Можете ли вы помочь мне создать правильный агрегация для создания этого результата?

1 Ответ

0 голосов
/ 10 апреля 2020

Вы можете достичь желаемого результата с помощью следующего конвейера агрегации:

db.orders.aggregate([
    {
        $unwind: "$status"
    },
    {
        $group: {
            _id: "$status.Origin",
            Total: { $sum: 1 },
            data: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            Country: "$_id",
            Total: 1,
            Started: {
                $size: {
                    $filter: {
                        input: "$data",
                        cond: { $eq: ["$$this.status.Detail", "Started"] }
                    }
                }
            },
            Received: {
                $size: {
                    $filter: {
                        input: "$data",
                        cond: { $eq: ["$$this.status.Detail", "Received"] }
                    }
                }
            }
        }
    }
])

Вот простой способ , чтобы запустить агрегацию, используя c# с некоторой формой безопасности типов.

тест: https://mongoplayground.net/p/1x0wrJlTmJl

...