Как я могу запросить документ монго, используя его атрибут коллекции (acts_as_tree), используя консоль mongoid и mongo? - PullRequest
0 голосов
/ 04 июля 2011

вот моя модель:

class Person
  acts_as_tree
end

я связываю несколько объектов в виде дерева:

          P1
          |
         ---
        |   |
     P1.1   P1.2
       |
      ---
     |   |
P1.1.1   P1.1.2

здесь, если мне нужно получить P1.1.1, мне нужно написать запрос, который эффективноспрашивает:

get me the Person with name P1.1.1 and path (given by acts_as_tree) [P1, P1.1].

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

как мне это сделать?

> db.people.find({name: 'P1.1.1'})

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

> db.people.find({name: 'P1.1.1', path: [{name: 'P1'}, {name: 'P1.1'}]})

не работает.ни один не делает:

> db.people.find({name: 'P1.1.1', path: [db.people.find({name: 'P1'}), 
                                         db.people.find({name: 'P1.1'})]})

, но это объясняет, что я пытаюсь сделать.

1 Ответ

0 голосов
/ 04 июля 2011

Один из способов, которым вы можете запросить что-то вроде следующего:

db.people.find({name : 'Joe', 'path' : { $all : [ObjectId("4e0fcf1722b7a9439200002e"), ObjectId("4e0fcf1622b7a9439200002b")]}})

Однако я думаю об этом недостатке:

  • Вы не можете заменитьобъект отношения / включается непосредственно в оболочку монго.Вы должны использовать объект ObjectId
  • . Условие $ all не требует, чтобы порядок пути был строго одинаковым, что означает, что придет человек с именем «Джо», на который ссылается путь «родной город / город /».вверх, а также "Джо" из "Тома / родного города".

Я бы предположил, что второй может нарушить условия сделки.Кроме того, я предполагаю, что mongoid в некоторых случаях передает параметры запроса непосредственно в mongodb (или, по крайней мере, есть способы сделать это).Следовательно, должна быть возможность выполнить поиск в коде ruby, используя приведенный выше запрос.

Тем не менее, я сделаю еще один повторный поиск по этому вопросу и опубликую свои выводы.

Надеюсь, что это поможет.

Редактировать

Чтобы облегчитьВторая проблема, описанная выше, - это еще один способ опроса человека с определенным путем.Найдите его ниже:

db.people.find({name : 'Joe', 'path.0' :ObjectId("4e0fcf1722b7a9439200002e"), 'path.1':ObjectId("4e0fcf1622b7a9439200002b")})

Это гарантирует, что путь - это именно то, что вы ищете.Однако это работает в оболочке mongodb, и вам все равно может понадобиться выяснить, как mongoid может выполнить эквивалент этого.Кроме того, вам может потребоваться построить этот запрос динамически, чтобы создать путь для человека, и это (для людей с глубоким вложением) может просто стать длинным и безобразным.

Я бы предложил пролистать следующие ссылки в документации mongodb, чтобы лучшепонимание.

http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

Надеюсь, это то, что вы искали.

...