Mongoid:通过Hash获取行

时间:2011-12-18 13:47:38

标签: ruby mongodb mongoid

我的Mongo表中有一个字段存储为Hash。

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

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

喜欢Ruby:

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

1 个答案:

答案 0 :(得分: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使用数组的方式,这将找到valuesvalue个{{1}}“迈克尔”中至少有一个元素的所有文档。但请注意,这将找到父文档,而不是键/值对本身。