1

単純なデータベースがあり、英語とスペイン語の両方、および/または英語とフランス語(スペイン語とフランス語は除く)を話すすべてのユーザーを検索しようとしているとします。次のように設定されたいくつかのレコードを含むusersテーブルがあります。

{
    "username": "jdoe",
    "languages": ["english", "spanish", "french"]
}

次のように検索すると、期待どおりの結果が得られます。

db.find({ "languages" : { $all:['english', 'spanish'], $all:['english', 'french'] } })

しかし、Cakeでそれを行う方法がわかりません。私は次のように単一の言語ペアを一致させることができます:

$this->User->find('all', array('conditions' => 'User.languages' => array('$all' => array('english', 'spanish'))));

しかし、私は複数のペアを検索する方法に固執しています。配列の配列はそれを行わないようです。

これは他の誰かが始めたプロジェクトなので、私はCakePHPやMongoDBのニュアンスに特に精通していません。当たり前のことを見落としているような気がします。何か案は?

4

1 に答える 1

4

シェルクエリの例では、テストデータに対して期待される結果が返された可能性があります$allが、クエリオブジェクトのプロパティを壊しているため、技術的には正しくありません。トップレベルの$or演算子を使用すると、正しいクエリは次のようになります。

db.users.find({"$or": [
    {"languages": {"$all": ["english", "spanish"]}},
    {"languages": {"$all": ["english", "french"]}}
]});

これは、CakePHPに次のように変換されます。

$results = $this->User->find('all', array('conditions' => array(
    '$or' => array(
        array('User.languages' => array('$all' => array('english', 'spanish'))),
        array('User.languages' => array('$all' => array('english', 'french'))),
    ),
)));

_idCakePHPアプリで次のフィクスチャデータ(sans's)を使用してこれをテストしました。

{ "username" : "john", "languages" : [ "english", "spanish", "french" ] }
{ "username" : "mike", "languages" : [ "spanish", "french" ] }
{ "username" : "bill", "languages" : [ "english" ] }
{ "username" : "fred", "languages" : [ "english", "french" ] }
{ "username" : "luke", "languages" : [ "english", "spanish" ] }

ジョン、フレッド、ルークが返されます。

于 2012-05-14T20:16:18.000 に答える