MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでクエリを動的に構築する方法を徹底解説

MongoDBでクエリを動的に構築するには、条件に応じてクエリオブジェクトを組み立てるスクリプト(JavaScript関数)を作成する必要があります。本記事では、配列フィールドへの検索条件を動的に生成し、aggregate$matchステージで実行するまでの具体的な手順を、サンプルコード付きでわかりやすく解説します。

1. サンプルコレクションの作成

まず、ドキュメントを格納するコレクションを作成しましょう。ここでは「dynamicQueryDemo」というコレクションに、名前(Name)と科目(Subject)の配列を持つドキュメントを3件挿入します。

> db.dynamicQueryDemo.insertOne({"Name":"John","Subject":["MongoDB","MySQL"]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef5c5def71edecf6a1f69a")
}
> db.dynamicQueryDemo.insertOne({"Name":"John","Subject":["C","C++"]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef5c73ef71edecf6a1f69b")
}
> db.dynamicQueryDemo.insertOne({"Name":"John","Subject":["MongoDB","Java"]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef5c8bef71edecf6a1f69c")
}

2. 登録したドキュメントの確認

find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。

> db.dynamicQueryDemo.find().pretty();

上記のコマンドを実行すると、以下のような出力が得られます。

{
    "_id" : ObjectId("5cef5c5def71edecf6a1f69a"),
    "Name" : "John",
    "Subject" : [
        "MongoDB",
        "MySQL"
    ]
}
{
    "_id" : ObjectId("5cef5c73ef71edecf6a1f69b"),
    "Name" : "John",
    "Subject" : [
        "C",
        "C++"
    ]
}
{
    "_id" : ObjectId("5cef5c8bef71edecf6a1f69c"),
    "Name" : "John",
    "Subject" : [
        "MongoDB",
        "Java"
    ]
}

3. クエリを動的に組み立てる関数を定義する

続いて、引数として渡された科目の配列をもとに、検索条件オブジェクトを動的に生成する関数を定義します。ポイントは条件分岐のロジックです。配列が空の場合は$nin(指定した値を含まない)、それ以外の場合は$in(指定した値のいずれかを含む)を設定するようにしています。

> function findDocument(subject) {
    var find = {};
    if (subject.length == 0)
        find["$nin"] = subject;
    else
        find["$in"] = subject;
    return find;
}
> var sub = ["MySQL","MongoDB"];
> var myDoc = findDocument(sub);

このように関数化しておくことで、入力されるパラメータの内容に応じて、同じコードから異なる検索条件を柔軟に生成できます。

4. aggregateの$matchステージで動的クエリを実行する

定義した関数で生成した条件オブジェクト(myDoc)を、aggregate$matchステージに渡してコレクションを絞り込みます。

> db.dynamicQueryDemo.aggregate([{
    $match: {
        "Subject": myDoc,
    }
}]);

このクエリを実行すると、Subjectフィールドに「MySQL」または「MongoDB」を含むドキュメントだけが抽出され、以下の出力が得られます。

{ "_id" : ObjectId("5cef5c5def71edecf6a1f69a"), "Name" : "John", "Subject" : [ "MongoDB", "MySQL" ] }
{ "_id" : ObjectId("5cef5c8bef71edecf6a1f69c"), "Name" : "John", "Subject" : [ "MongoDB", "Java" ] }

まとめ

MongoDBでクエリを動的に構築する際は、JavaScript関数内で条件分岐を行いながらクエリオブジェクトを組み立てるのが基本です。今回のように$in$ninを状況に応じて切り替えることで、入力パラメータが可変でも柔軟に対応できます。検索フォームなど、ユーザーの入力条件が変化するWebアプリケーション開発において特に役立つテクニックなので、ぜひ活用してみてください。

  1. MongoDBのサブドキュメントを検索する方法:ドット表記を使ったクエリ実行手順を解説

    MongoDBでは、ネストされたサブドキュメント(埋め込みドキュメント)を検索する際に、ドット表記(dot notation)を使用します。フィールド名とサブフィールド名をドット(.)でつなぐことで、階層構造を持つデータにも簡単にアクセスできます。この記事では、実際にコレクションを作成し、サブドキュメントに対してクエリを実行するまでの手順をサンプルコード付きで解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って、サブドキュメントを含むドキュメントをコレクションに挿入します。> db.demo537.insertOne({details:{S

  2. MongoDBでSQLのLIKE検索と同じことを実現する方法

    MongoDBにおけるLIKE検索の基本SQLの「LIKE」句のように部分一致でデータを検索したい場合、MongoDBでは find() メソッドと正規表現(//)を組み合わせることで同様の処理を実現できます。この記事では、実際にコレクションを作成し、正規表現を使ったLIKE検索の具体的な手順を解説します。テスト用コレクションの作成まず、サンプルとなるドキュメントを含むコレクションを作成しましょう。ここでは「FirstName」というフィールドを持つドキュメントをいくつか登録します。> db.demo686.insertOne({FirstName:Robert});{ &nb