5

PHP 配列構文を使用したこの MongoDB クエリで問題が発生しています。これは、使用したいクエリの直接バージョンです。

db.collection.find({
        $or: [
            {$and : [{X:1}, {X: {$gt: 100}}]},
            {$and : [{X:2}, {X: {$lt: 100}}]}
        ]
});

注: 実際のクエリはより複雑です。これは単なる例です。

PHP でこの種のクエリを説明している例をいくつか見つけることができませんでした。私が思いついた最高のものはこれでした:

$query = array(
    '$or' => array(
        array(
            '$and' => array(
                array('X' => 1),
                array('X' => array('gt' => 100))
            )
        ),
        array(
            '$and' => array(
                array('X' => 2),
                array('X' => array('lt' => 100))
            )
        ),
    )
);

$this->db->collection->find($query);

しかし、このクエリは結果を返しません。PHP 配列に重複するキーを含めることはできないため、明らかに$and配列から削除することはできません。

速度が重要なので、JavaScript 式は使用したくありません。

更新: Alexander Azarov がコメントで指摘したように、元のクエリは別の方法で記述できます。適切に使用された $andクエリで質問を更新しました。

4

1 に答える 1

13

Here is an example of the code with or and and operators in PHP for a Mongo query.

It uses different field names from what you are going to find in your query, but it is straightforward to understand how to use it.

Right now I don't have time to change it, to match your query, but if you have problems with that, let me know and I will adjust it. This query is working and finding what it should find.

$arrFind = array(
    '$or' => array(
        array(
            '$and' => array(
                array(
                    UI_name => array(
                        '$regex' => 'andrew',
                        '$options' => 'i'
                    )
                ),
                array(
                    UI_surname => array(
                        '$regex' => 'mik',
                        '$options' => 'i'
                    )
                )
            )
        ),
        array(
            '$and' => array(
                array(
                    UI_surname => array(
                        '$regex' => 'andrew',
                        '$options' => 'i'
                    )
                ),
                array(
                    UI_name => array(
                        '$regex' => 'mik',
                        '$options' => 'i'
                    )
                )
            )
        ),
    )
);
于 2012-01-02T11:10:31.120 に答える