Mongo Query数组,当数组键未知时?

时间:2011-05-20 11:39:05

标签: php mongodb

我在数据库中有以下内容, 我喜欢用搜索词“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 个答案:

答案 0 :(得分:2)

您遇到的问题是数据的结构。

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
        )

答案 1 :(得分:0)

您可以像普通值一样查询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})