Arhn - архитектура программирования

Как построить конвейер агрегации монго с вложенными и/или условиями?

Я пытаюсь создать конвейер агрегации, который отфильтровывает документы с использованием условия AND(OR(AND).

Мне нужно что-то вроде

if (A == "A" && B == "B" && (C == NULL || (C != NULL && C == "C")))

Мой запрос выглядит следующим образом.

Внутренняя часть:

var x = new BsonDocument
                {
                    {
                        "$or",
                        new BsonArray
                        {
                            new BsonDocument {{"C", BsonNull.Value}},
                            new BsonDocument
                            {
                                {
                                    "$and",
                                    new BsonArray
                                    {
                                        new BsonDocument
                                        {
                                            {
                                                "C",
                                                new BsonDocument {{"$ne", BsonNull.Value}}
                                            }
                                        },
                                        new BsonDocument {{"C", C}}
                                    }
                                }
                            }
                        }
                    }
                };

Тогда полный фильтр

var filter = new BsonDocument
            {
                {
                    "$and",
                    new BsonArray
                    {
                        new BsonDocument {{"A", A}},
                        new BsonDocument {{"B", B}},
                        x
                    }
                }
            };

Затем я называю это так:

var y = await collection.Aggregate().Match(filter).ToListAsync();

Однако он не возвращает никаких результатов, хотя должен.

В моем отладчике окончательный Bson выглядит так:

{
    {
        "$and": [
            {
                "A": "A"
            },
            {
                "B": "B"
            },
            {
                "$or": [
                    {
                        "C": null
                    },
                    {
                        "$and": [
                            {
                                "C": {
                                    "$ne": null
                                }
                            },
                            {
                                "C": "C"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}
09.12.2020

  • Используйте оболочку mongo, чтобы определить правильный запрос с помощью MQL, а затем переведите его на C#. 09.12.2020

Ответы:


1

Удалось разобраться. Я изменил запрос, чтобы построить его как совпадение, так как его легче тестировать с оболочкой mongo:

var match = new BsonDocument
{
    {
        "$match",
        new BsonDocument
        {
            {
                "$and",
                new BsonArray
                {
                    new BsonDocument {{"A", A}},
                    new BsonDocument {{"B", B}},
                    new BsonDocument
                    {
                        {
                            "$or",
                            new BsonArray
                            {
                                new BsonDocument {{C, BsonNull.Value}},
                                new BsonDocument
                                {
                                    {
                                        "$and",
                                        new BsonArray
                                        {
                                            new BsonDocument
                                            {
                                                {
                                                    "C",
                                                    new BsonDocument {{"$ne", BsonNull.Value}}
                                                }
                                            },
                                            new BsonDocument {{"C", C}}
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
};

Надеюсь, это поможет любому, кто столкнулся с проблемой с подобным запросом.

10.12.2020
  • если вы не знаете, вы можете сделать collection.Aggregate().Match("{ json_string }").ToListAsync(). нет необходимости засорять код С# всеми этими битами new BsonDocument. 10.12.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..