Замените Root драйвером C # для ядра .net AggregateExpressionDefinition - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь выполнить простую раскрутку и заменить root в .net core 2.2.Я уже пробовал запрос в MongoDB, и он работает, но мне трудно перевести его на 100% в C # без использования волшебных строк.

Это мой документ:

{
    "_id" : ObjectId("5cb6475b20b49a5cec99eb89"),
    "name" : "Route A"
    "isActive" : true,
    "buses" : [ 
        {
            "capacity" : "15",
            "time" : "08:00:00",
            "direction" : "Inbound"
        },
        {
            "capacity" : "15",
            "time" : "08:30:00",
            "direction" : "Inbound"
        },
        {
            "capacity" : "15",
            "time" : "08:00:00",
            "direction" : "Outbound"
        },
        {
            "capacity" : "15",
            "time" : "08:30:00",
            "direction" : "Outbound"
        }
    ]
}

У меня также есть класс для корневого документа под названием «Маршруты» и еще один для вложенного документа под названием «Шина».

Этот запрос, который я запускаю в монго, следующий:

db.routes.aggregate([
    { $match : { "_id" : ObjectId("5cb4e818cb95b3572c8f0f2c") } },
    { $unwind: "$buses" },
    { $replaceRoot: { "newRoot": "$buses" } }
])

ОжидаемыйВ результате получается простой массив шин, и пока я получаю его с этим запросом в C #

_routes.Aggregate()
                .Match(r => r.Id == routeId)
                .Unwind<Route, UnwoundRoute>(r => r.Buses)
                .ReplaceRoot<Bus>("$buses")
                .ToListAsync();

Я хочу знать, возможно ли заменить строку «$bus» чем-то, что не является жестко закодированным.

Я пытался использовать класс AggregateExpressionDefinition, который является одним из возможных параметров, которые может получить метод ReplaceRoot, но я не смог понять его полностью.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Публикация этого сообщения на случай, если кто-то в конце концов совершит те же ошибки, что и я.

Я в основном создал новую сущность "UnwoundRoute" для хранения результатов операции раскрутки, а затем использовал простое выражение LINQ. Спасибо пользователю reddit u / Nugsly за предложение изменить способ раскрутки.

Это работает:

_routes.Aggregate()
                .Match(r => r.Id == routeId)
                .Unwind<Route, UnwoundRoute>(r => r.Buses)
                .ReplaceRoot(ur => ur.Buses)
                .ToListAsync();

Вы также можете отфильтровать результат замены корня впоследствии:

_routes.Aggregate()
                .Match(r => r.Id == routeId)
                .Unwind<Route, UnwoundRoute>(r => r.Buses)
                .ReplaceRoot(ur => ur.Buses)
                .Match(b => b.Direction == direction)
                .ToListAsync();

И он вернет массив документов.

{
    "capacity" : "15",
    "time" : "08:00:00",
    "direction" : "Inbound"
},
{
    "capacity" : "15",
    "time" : "08:30:00",
    "direction" : "Inbound"
}

Кроме того, если вы попытаетесь добавить тип результата для замены корневого VS, будет выдано сообщение об ошибке, говорящее о том, что лямбда-выражение не может быть преобразовано, поскольку это не тип делегата.

Это не так (что я имел в начале):

_routes.Aggregate()
                .Match(r => r.Id == routeId)
                .Unwind<Route, UnwoundRoute>(r => r.Buses)
                .ReplaceRoot<Bus>(ur => ur.Buses)
                .ToListAsync();
0 голосов
/ 24 апреля 2019

Я могу предложить вам решение, которое использует MongoDAL, который является просто оболочкой для драйвера c #, который скрывает большую часть сложности драйвера.

using System;
using System.Linq;
using MongoDAL;

namespace BusRoutes
{
    class Route : Entity
    {
        public string name { get; set; }
        public bool isActive { get; set; }
        public Bus[] buses { get; set; }
    }

    class Bus
    {
        public int capacity { get; set; }
        public string time { get; set; }
        public string direction { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new DB("busroutes");

            var routeA = new Route
            {
                name = "Route A",
                buses = new Bus[]
                {
                    new Bus { capacity = 15, direction = "Inbound", time = "8:00:00"},
                    new Bus { capacity = 25, direction = "Outbound", time = "9:00:00" },
                    new Bus { capacity = 35, direction = "Inbound", time = "10:00:00" }
                }
            };

            routeA.Save();

            var query = routeA.Collection()
                .Where(r => r.ID == routeA.ID)
                .SelectMany(r => r.buses);

            Console.WriteLine(query.ToString());

            var busesOfRouteA = query.ToArray();

            foreach (var bus in busesOfRouteA)
            {
                Console.WriteLine(bus.time.ToString());
            }

            Console.ReadKey();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...