如何使用mongoid和mongo控制台使用其集合属性(acts_as_tree)查询mongo文档?

时间:2011-07-04 15:36:49

标签: mongodb mongoid

这是我的模特:

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 :(得分:0)

您可以通过以下方式查询以下内容之一:

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

然而,我想到的缺点是:

  • 您无法直接在mongo shell中替换对象关系/连接。您必须使用ObjectId对象
  • $ all子句并不要求路径的顺序完全相同,这意味着路径“hometown / town /”引用的名称为“Joe”的人会从“tome”中出现“Joe” /家乡”。

我认为第二个可能是交易破坏者。另外,我假设mongoid在几种情况下直接通过查询选项传递给mongodb(或者至少有办法做到这一点)。因此,应该可以使用上面的给定查询在ruby代码中进行搜索。

尽管如此,我还会对此进行更多的重新搜索并发回我的发现。

希望它有所帮助。

修改

为了缓解上面的第二个问题,还有另一种方法来查询具有特定路径的人。在下面找到它:

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

这将确保路径正是您正在寻找的路径。然而,这适用于mongodb shell,你可能仍然需要弄清楚,mongoid如何运行相当于此。另外,您可能必须动态构造此查询以创建人员路径(对于深层嵌套人员)可能会变得冗长而丑陋。

我建议浏览mongodb文档中的以下链接,以便更好地理解。

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

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

我希望这就是你要找的东西。