Mongoid: извлекайте строки через Hash - PullRequest
0 голосов
/ 18 декабря 2011

В моей таблице Монго есть поле, которое хранится в виде хэша.

"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 Ответ

1 голос
/ 18 декабря 2011

Вы можете использовать мультиключи для имитации большого числа индексов , что делает такие запросы ключ / значение более эффективными. Однако values должен быть массивом, а не сложным объектом с неизвестной схемой, поскольку это исключает индексацию по определению.

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

db.SomeCollection.ensureIndex("values");

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

Из-за того, что MongoDB работает с массивами, он найдет все документы, которые содержат хотя бы один элемент в values с value "Michael". Однако обратите внимание, что при этом будет найден родительский документ, а не сама пара ключ / значение.

...