запрашивать определенные поля в mongoid

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

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

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

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

С уважением


person lordmkichavi    schedule 25.11.2011    source источник
comment
Я использую версии mongoid 2.0.2, rails 3.1, ruby ​​1.9.2 и mongodb 1.6.6.   -  person lordmkichavi    schedule 25.11.2011
comment
Извините, но я не понял, что именно вы хотите. Вы хотите найти встроенный документ _id и name на неизвестной глубине в этом древовидном документе?   -  person KL-7    schedule 26.11.2011


Ответы (2)


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

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

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

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

  • Pros:
    • Single document to fetch per page
    • Одно место на диске для всего дерева
    • Вы можете легко увидеть полную структуру
  • Cons
    • Hard to search
    • Трудно вернуть частичные результаты
    • Может стать громоздким, если вам нужно огромное дерево. Кроме того, существует ограничение на размер документов в MongoDB — 16 МБ в версии 1.8 (лимит может возрасти в следующих версиях).

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

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

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

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

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

Есть смысл?

person Tyler Brock    schedule 28.11.2011

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

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

Из «Прочитай меня»:

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
person twooface    schedule 29.11.2011