1

単一のクエリでループされたコードをコンパイルすることで、いくつかの db アクションを保存しようとしています。クエリを実行する前に、ループを使用して like ステートメントに単純に追加する前に、Mongo で同じアイデアを得ることができません。idどんなアイデアでも感謝します....私は基本的に好きなことをしようとしていますが、値を配列として使用しています

(「app」は、「mongodb」を CI セットアップに置き換えます)

モンゴフィケーションの前に私がそれを行っていた方法は次のとおりです。

    foreach ($workids as $workid):
         $this->ci->app->or_like('work',$workid)    ;
    endforeach;
    $query = $this->ci->db->get("who_users");
    $results = $query->result();
    print_r($results);

これが私がそれを機能させることを望んでいた方法ですが、ここでは喜びではありません。その関数は文字列を受け入れるようにのみ設計されています

    $query = $this->ci->app->like('work',$workids,'.',TRUE,TRUE)->get("who_users");
    print_r($query);

誰かが狡猾な方法を思い付くことができれば、返された配列を 1 回の呼び出しで取得できます。この種のクエリに関するドキュメントは見つかりませんでした。私が考えることができる唯一の方法は、クエリを実行して新しい結果配列にプッシュします....しかし、アプリがスケールアップすると、それは本当に害になります。

4

1 に答える 1

1

codeigniter-mongodb-libraryを使用していますか?既存のor_like()%ドキュメントに基づくと、CIは各一致をワイルドカードでラップしているように見えます。$orMongoでの同等のクエリは、句内の一連の正規表現の一致になります。

db.who_users.find({
    $or: [
    { work: /.*workIdA.*/ },
    { work: /.*workIdB.*/ },
    ...
]});

work残念ながら、これは、(1)フィールドにインデックスが付けられ、(2)正規表現が一定の値(eg)で固定されていない限り、非常に非効率になります/^workId.*/これについては、Mongoの正規表現のドキュメントで詳しく説明されています。

OPへのコメントに基づくと、workフィールドに複数のIDをカンマ区切りの文字列として格納しているようです。Mongoのスキーマを利用するには、これを文字列の配列としてモデル化する必要があります。その後、workフィールドでクエリを実行すると、Mongoは配列内のすべての値を考慮します(ここで説明されています)。

db.who_users.find({
    work: "workIdA"
});

このクエリは、work値が。であるレコードと一致します["workIdA", "workIdB"]また、IDのセットの1つを検索する必要がある場合(これをORクエリに戻す)、 $in演算子を使用してこの例を拡張できます。

db.who_users.find({
    work: { $in: ["workIdA", "workIdB", ...] }
});

それがニーズを満たしている場合は、必ずworkフィールドにもインデックスを付けてください。

于 2012-05-23T18:35:26.650 に答える