这是我的模特:
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'})]})
但这解释了我正在尝试做什么。
答案 0 :(得分:0)
您可以通过以下方式查询以下内容之一:
db.people.find({name : 'Joe', 'path' : { $all : [ObjectId("4e0fcf1722b7a9439200002e"), ObjectId("4e0fcf1622b7a9439200002b")]}})
然而,我想到的缺点是:
我认为第二个可能是交易破坏者。另外,我假设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
我希望这就是你要找的东西。