2

我正在尝试将此查询转换为数组,以便我可以在 PHP 中使用,但我遇到了“索引”问题...如您所见,我需要多个“$ 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' 字段的文档。第二组验证“类型”字段,我需要将“评论”作为值或“帖子”且“用户 ID”为 123456 的文档。第三组验证“标签”字段,我需要一些“标签” '$in' 或 'tags' = false 或 'tags' 中的 .name' 不存在...

这 3 组必须是真的,这就是为什么它们都在 '$and' 运算符中...我知道 '$and' 仅在 2.0+ 中有效,但我使用的是 2.1(聚合框架测试.. . 它只是摇滚!XD)

我想就是这样......如果有另一种编写查询的方式,我真的很想看到......谢谢!

4

1 回答 1

5

这是您在 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
}
于 2012-07-26T20:56:56.790 回答