Массив запросов Mongo, когда ключ массива неизвестен?

#php #mongodb

#php #mongodb

Вопрос:

У меня есть следующее в базе данных, и мне нравится находить этот элемент с помощью поискового запроса «открыть»

Я думаю, это должно быть примерно так???

  $query = array(array('keywords' => array('$in'=>'open')));
 $cursor = $collection->find($query);
 return iterator_to_array($cursor);
  

В базе данных:

 [3b33162ad4ed5ffdeb88a1b2085535b1] => Array
    (
        [_id] => 3b33162ad4ed5ffdeb88a1b2085535b1
        [title] => Something
        [keywords] => Array
            (
                [2] => open
                [7] => source
            )

        [added] => MongoDate Object
            (
                [sec] => 1305884144
                [usec] => 658000
            )

    )
  

Комментарии:

1. И вопрос в том? В чем проблема? И почему вложенный массив (…)?

Ответ №1:

Проблема, с которой вы столкнулись, заключается в структуре ваших данных.

MongoDB изначально работает с массивами при выполнении запросов. Сработает следующее.

 $document = array( 'keywords' => array('open', 'source') );
$collection->insert($document);
$collection->find( array('keywords' => 'open') );
  

Проблема в том, что keywords в вашем документе нет массива. В вашем документе keywords есть другой документ.

 'keywords' => array( '2' => 'open',
                     '7' => 'source' )
  

В JSON это выглядело бы так:

 { 'keywords' : { '2': 'open', '7': 'source' } };
  

Исходя из того, что вы пытаетесь сделать, вам нужно сохранить ключевые слова в виде массива, а не в виде хэш-таблицы.

В PHP не всегда очевидно, с чем вы имеете дело во время кода. Однако, если вы print_r создадите массив, он будет выглядеть следующим образом. Обратите внимание, что массив основан на нуле и в нем не пропущено ни одного ключа.

     [keywords] => Array
        (
            [0] => open
            [1] => source
            [2] => rules
        )
  

Ответ №2:

Вы можете запрашивать массивы в MongoDB как обычные значения. Вот пример в оболочке JavaScript.

 > db.php.insert({title: "something", keywords: ["foo","bar"]})
> db.php.insert({title: "something", keywords: ["open","bar"]})
> db.php.insert({title: "something", keywords: ["baz","faz"]})
> db.php.find({ keywords: "open" });
{ "_id" : ObjectId("4dd677229a547d85bb02fce5"), "title" : "something", "keywords" : [ "open", "bar" ] }
  

Для более быстрых запросов вам следует создать индекс в массиве.

db.php.ensureIndex({ключевые слова: 1})

Комментарии:

1. Какое это имеет отношение к конкретному вопросу PHP?

2. Он не знал, как запрашивать поля ключевых слов. Я показал ему в оболочке JavaScript, как он может это сделать. Ему просто нужно перевести запрос на PHP. Вероятно, это: $query = array(«ключевые слова» => «открыть»).

3. Я не понимаю! Я все еще не знаю, как запросить что-либо, если ключ неизвестен.