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' フィールドを持たないドキュメントが必要です。2 番目のセットは「タイプ」フィールドを検証します。ここでは、値として「コメント」または「投稿」を持ち、かつ「user_id」が 123456 であるドキュメントが必要です。3 番目のセットは、いくつかの「タグ」が必要な「タグ」フィールドを検証します。 '$in' または 'tags' 内の .name = false または 'tags' が存在しません...

これらの 3 つのセットは true でなければなりません。そのため、それらはすべて「$and」演算子に含まれています...「$and」は 2.0+ でのみ機能することは承知していますが、2.1 を使用しています (集計フレームワーク テスト.. . それはまさに ROCKS! 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 に答える