我在数据库中有以下内容,我喜欢找到带有搜索词"打开"的项目
我猜它应该是这样的???
$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
)
)
您遇到的问题是数据的结构。
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
)
您可以在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})