我正试图将此查询转换为数组,以便在PHP中使用,但我遇到了"index"问题。。。正如您所看到的,我需要倍数'$or',因为每个'$or'都验证一组字段,并且我不能将它们全部连接到同一'$or`中。
这是查询对象:
{
'$and' : [
{ '$or' : [
{'author' : { '$exists' : false } }
, {'author' : { '$in' : [ 'john' , false ] } }
] }
, {'$or' : [
{ '$and' : [ { 'type' : 'post' } , { 'user_id' : 123456 } ] }
, { 'type' : 'comment' }
] }
, { '$or' : [
{ 'tags.name' : { '$in' : [ 'tag1' , 'tag2' ] } }
, { 'tags' : false }
, { 'tags' : { '$exists' : false } }
] }
]
}
第一组'$or'验证了'author'字段,所以我在字段中搜索任何带有'john'或false的文档,并且我想要没有'author'域的文档。第二组验证"type"字段,其中我需要将"comment"作为值或"post"的文档,并且"user_id"为123456。第三个集合验证"tags"字段,其中我需要在"$in"或"tags"=false"或"tags"不存在的内部有一些"tags.name"。。。
这3个集合必须是真的,这就是为什么它们都在"$和"运算符中。。。我知道'$and'只能在2.0+中工作,但我使用2.1(聚合框架测试…它只是摇滚!XD)
我想就是这样……如果有另一种写查询的方式,我真的很想看到。。。谢谢
以下是您在PHP 中的查询
$conn = new Mongo("localhost:$port");
$db = $conn->test;
$collection = $db->tb;
$or1 =
array( '$or' => array(
array( 'author' => array( '$exists' => false ) ) ,
array( 'author' => array( '$in' => array('john', false) ) )
));
$or2 =
array( '$or' => array(
array( '$and' =>
array(
array( 'type' => 'post') ,
array( 'userid' => 123456 )
)
),
array( 'type' => 'comment')
));
$or3 =
array( '$or' => array(
array( 'tags.name' => array( '$in' => array('tag1', 'tag2') ) ) ,
array( 'tags' => false ),
array( 'tags' => array( '$exists' => false ) )
));
$query = array( '$and' => array( $or1, $or2, $or3 ) );
$cursor = $collection->find($query);
foreach( $cursor as $doc ) {
// do something
}