запросить конкретные поля в Mongoid - PullRequest
0 голосов
/ 25 ноября 2011

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

{
    _id: ObjectId(xxx),
    name: xxx,
    subs: [{
        _id: ObjectId(yyy),
        name: yyy,
        subs: [{
            _id: ObjectId(zzz),
            name: zzz,
            subs: [...]
        }]
    }]
}

Мне нужно это, учитывая конкретный ObjectId, получающий элемент с полями: _id, name

Примечание: один документ со всей информацией.

привет

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Если вы строите древовидную структуру в монгоиде.Я бы посоветовал заглянуть в Mongoid Tree

. Это хороший драгоценный камень, который даст вам все или хотя бы большинство вещей, которые вам нужны.

От Read Me:

class Node
  include Mongoid::Document
  include Mongoid::Tree
end



Node.root
Node.roots
Node.leaves
node.root
node.parent
node.children
node.ancestors
node.ancestors_and_self
node.descendants
node.descendants_and_self
node.siblings
node.siblings_and_self
node.leaves
1 голос
/ 28 ноября 2011

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

Существует много способов хранения иерархических данных, и я бы посоветовал вам взглянуть на документы 10gen здесь , они довольно тщательные, но я кратко изложу для вас ниже.

Давайте рассмотрим некоторые идеи, представленные в этом документе, начиная с хороших частей и недостатков вашего текущего подхода.

Полное дерево в одном документе (что вы делаете сейчас)

  • Плюсы:
    • Один документ для загрузки на страницу
    • Одно место на диске для всего дерева
    • Вы можете легко увидеть полную структуру
  • Cons
    • Трудно найти
    • Трудно вернуть частичные результаты
    • Может стать громоздким, если вам нужно огромное дерево. Кроме того, существует ограничение на размер документов в MongoDB - 16 МБ в версии 1.8 (ограничение может увеличиться в будущих версиях).

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

Массив Предков

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

Материализованный путь

При таком подходе вы сохраняете полный путь к документу в виде строки предков и запросов с помощью регулярного выражения.

Имеет смысл?

...