Получить документы, содержащие массив, содержащий другой атрибут документа

Я храню некоторую файловую систему в Mongo, где каталоги называются категориями.

Категория JSON выглядит так:

{
   "name":"CategoryChildLevel2",
   "parentId":"2",
   "otherAttribute":"anyVal",
   "breadcrumb":[
      {
         "name":"RootCategory",
         "id":"1"
      },
      {
         "name":"CategoryChildLevel1",
         "id":"2"
      }
   ]
}

Категории FS связаны вместе с атрибутом parentId.

Мне нужно отобразить категории панировочных сухарей. Через навигацию пользователя мы можем знать, где мы находимся в FS, но к категориям можно получить доступ по их идентификатору (категория с закладками, поисковая система ...) без какой-либо навигации по FS. Чтобы избежать рекурсивных вызовов в БД, чтобы иметь возможность получить пакет, я его денормализовал.


Проблема заключается в том, что эта сводка трудно поддерживать в актуальном состоянии, поскольку категорию верхнего уровня можно перемещать, и, таким образом, все ее детские сухари должны быть обновлены. Для обновления может быть много дочерних категорий, и есть разные способы решения этой проблемы. Некоторые из них безопасны, но дороги (рекурсия), а другие быстрее, но могут привести к некоторым несоответствиям.


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

Получить все категории, которые не имеют: последний элемент массива   breadcrumb.id = parentId

Я не думаю, что часть «последний элемент массива» возможна, но было бы неплохо иметь возможность:

Извлеките все категории, которые не имеют:   breadcrumb.id содержит parentId

Любое решение, доступное в Scala или Java-драйвере? Я использую Salat/Casbah.

This question may help you to understand what I'm facing: Which DB would you use? MongoDB/Neo4j/SQL... all of them?

3
nl ja de
Как делать деревья всегда сводятся к вашим запросам. Как вам нужно искать это дерево? Разделяются ли категории от списков файлов для FS так, что у вас есть одна коллекция категорий , а затем один из files ? К сожалению, деревья не легки в большинстве баз данных и обычно требуют рекурсии либо в поиске, либо в обновлении, причем наиболее эффективным является тот, который предлагает самые популярные запросы.
добавлено автор Sammaye, источник
Хм, ссылка немного, если я должен быть честным. Вы подумали о документах здесь: docs.mongodb.org/manual/tutorial/model-tree-structure , особенно материализованные пути. Это обновление тяжелое, но более легкое для запроса. Ваша пачка немного лишняя, потому что у вас есть проблема, что вы передали имя категории всем своим дочерним элементам, создавая подмножество объектов. Если бы вы использовали пути, вместо этого вы могли бы удовлетворить многие ваши запросы, т. Е. find ({path: /, 06060607 /}) для оценки того, находится ли этот идентификатор в конце.
добавлено автор Sammaye, источник
Возможно, вы также можете определить эти 20 запросов? Я вижу один запрос для каждой дочерней категории, содержащий родительский атм.
добавлено автор Sammaye, источник
никто не знал решения?
добавлено автор Sebastien Lorber, источник
Если у вас есть время для чтения, anwser находится в ссылке, которую я даю в конце :) Существует два разных коллекций для категорий и файлов. Но файлы должны быть осведомлены о своей панировке, чтобы при распечатке результатов поиска (20 результатов/страница для примера), хлебница доступна из коробки без необходимости 20 дорогих рекурсий
добавлено автор Sebastien Lorber, источник

1 ответы

Вы можете сделать Получить все категории, которые не имеют: последний массив element breadcrumb.id = parentId с помощью $ where оператор:

db.test.find({
   //Find docs were breadcrumb is empty or its last element's id != parentId
    $where: '!this.breadcrumb.length || this.breadcrumb[this.breadcrumb.length-1].id !== this.parentId' 
})
3
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MongoDB Russian
MongoDB Russian
1 086 участник(ов)

> db.stats() https://combot.org/chat/-1001035023078