Nano Hash - криптовалюты, майнинг, программирование

Mongodb: вычислить значение, прежде чем использовать его как connectFromField в агрегате

У меня есть структура дерева монго, которая выглядит так:

{"_id":uid1,"parent": null, "path": "#uid1", "name": "a"}
{"_id":uid2,"parent": "uid1", "path": "#uid1#uid2", "name": "b"}
{"_id":uid3,"parent": "uid1", "path": "#uid1#uid3", "name": "c"}
{"_id":uid4,"parent": "uid2", "path": "#uid1#uid2#uid4", "name": "1"}
{"_id":uid5,"parent": "uid2", "path": "#uid1#uid2#uid5", "name": "2"}
{"_id":uid6,"parent": "uid1", "path": "#uid1#uid6", "name": "1"}
{"_id":uid7,"parent": "uid6", "path": "#uid1#uid6#uid7", "name": "x"}

где каждый узел представлен своим уникальным идентификатором uidx и расположен благодаря uid своего родителя. Каждый раз, когда родитель узла изменяется, его путь и пути его дочерних элементов автоматически изменяются (внутри предварительного сохранения мангуста).

Приведенный выше пример можно представить следующим образом:

a
|_b
|    |_1
|    |_2
|_c
    |_1
          |_x

Моя цель — создать запрос, который будет получать только листья под указанным узлом.

Если бы я сохранил родительский путь внутри родительского поля, а не только родительский идентификатор, я смог бы сделать это, используя следующий запрос:

db.tree.aggregate([
        {$match:{"parent": {$regex:"^#uid1#uid2"}}}, 
        {$graphLookup:{
                       from:"tree", 
                       startWith:"$path", 
                       connectFromField:"path", 
                       connectToField:"parent", 
                       as:"dep"}}, 
        {$match:{dep:[]}}, 
        {$project:{"_id":0, path:1}}
])

как уже было дано ответ в моем предыдущем вопросе здесь: Mongodb: получить только листья дерева

Проблема в том, что я этого не сделал.

Поэтому мне нужно каким-то образом преобразовать «connectToField» в моем запросе, чтобы он представлял путь моего родителя, а не идентификатор моего родителя. Кто-нибудь знает, как это сделать?

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

15.11.2017

Ответы:


1

Вам не нужно ничего вычислять и полагаться на path. Это точный вариант использования из https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/. Этап { $match: { dep: [] } } возвращает узлы без дочерних элементов, т. е. листья.

db.tree.aggregate([
    { $graphLookup: {
        from:"tree", 
        startWith:"$_id", 
        connectFromField:"_id", 
        connectToField:"parent", 
        as:"dep",
        maxDepth: 1
    } },
    { $match: { dep: [] } },                       
])

maxDepth: 1 добавлено, чтобы немного ускорить процесс. Как только у узла есть прямой дочерний элемент, вы не заботитесь об остальной части ветки, поэтому достаточно глубины 1 уровня для прямых дочерних элементов:

15.11.2017
  • Спасибо, вы абсолютно правы. По некоторым причинам я хотел использовать путь. 15.11.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..