Монго Query массив, когда ключ массива неизвестен? - PullRequest
2 голосов
/ 20 мая 2011

У меня есть подписка в базе данных, и мне нравится находить этот элемент с поисковым словом "open"

Это должно быть что-то вроде этого, я думаю ???

 $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
            )

    )

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

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

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
        )
0 голосов
/ 20 мая 2011

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

> 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 ({Keywords: 1})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...