2011-12-18 82 views
0

我在我的Mongo表中存储了作为散列存储的字段。Mongoid:通过哈希获取行

"values" : { 
    "4e64b7cb3e9b3a4d8a00000b" : "Page", 
    "4e77304b3e9b3a4ace000003" : "Michael", 
    "4e64b7cb3e9b3a4d8a00000c" : 6, 
    "4e64b7cb3e9b3a4d8a00000d" : 4, 
    "4e64b7cb3e9b3a4d8a00000e" : 2, 
    "4e64b7cb3e9b3a4d8a00000f" : 6, 
    "4e64b7cb3e9b3a4d8a000010" : 12 
} 

现在我需要获取所有行values存储数据等于Michael

像红宝石:

Table.all.select{|row| row.values.any?{|k,v| v == 'Michael' }} 

回答

1

可以use multikeys to simulate a large number of indexes这使得这样的键/值查询更高效。 values应该是一个数组,但是,而不是一个具有未知模式的复杂对象,因为它会按照定义排除索引。

SomeCollection 
{ 
    values : [ 
     { "key" : "4e64b7cb3e9b3a4d8a00000b", "value" : "Page" }, 
     { "key" : "4e77304b3e9b3a4ace000003", "value" : "Michael" }, 
     /* ... */ 
    ] 
} 

db.SomeCollection.ensureIndex("values"); 

db.foo.find({ values : {value: 'Michael'} }) 

因为MongoDB的工作与阵列的方式,这会发现,在values至少一个元素与value“迈克尔”的所有文档。但请注意,这会找到父文档,而不是键/值对本身。

+0

好办法!感谢名单!但是现在我已经有了很多与“4e64b7cb3e9b3a4d8a00000b”相关的逻辑:“Page”这种存储数据(它应该被重构)。那么也许我可以在不重构所有代码和方案的情况下进行这种提取? – fl00r 2011-12-18 13:59:40

+0

是的,你可以像其他任何东西一样进入对象 - 但它不会使用索引,所以它会很慢**:'db.foo.find({“values.4e64b7cb3e9b3a4d8a00000b”:“Page” })'。 – mnemosyn 2011-12-18 14:09:22

+0

'4e64b7cb3e9b3a4d8a00000b'是动态令牌:) – fl00r 2011-12-18 14:10:11