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

MongoDBでクエリ後に条件に一致するキーをリストへ追加する方法

MongoDBのaggregate()を使って、条件に一致するキーを配列(リスト)に追加・抽出する方法

MongoDBで、クエリ実行後に配列内の条件に一致する要素だけを抽出してリストとして残したい場合は、aggregate()メソッドを使用します。$addFieldsと$filterを組み合わせることで、指定した条件を満たすドキュメントのみを配列に残すことができます。

この記事では、実際のコード例を通して、その手順をわかりやすく解説します。

1. コレクションを作成してドキュメントを挿入する

まず、insertOne()メソッドを使ってサンプルコレクション「demo334」にドキュメントを作成します。

> db.demo334.insertOne({
...     "Name": "Chris",
...     "Age": 21,
...     "details": [{
...         "Subject": "MySQL",
...         "Score": 78
...     }, {
...         "Subject": "MongoDB",
...         "Score": 45
...     }]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e52241bf8647eb59e562090")
}

このドキュメントには、「Name」と「Age」フィールドに加え、「details」という配列フィールドがあり、各要素は科目名(Subject)と点数(Score)を持っています。

2. find()メソッドで全ドキュメントを表示する

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

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

上記のクエリを実行すると、次のような出力が得られます。

{
    "_id" : ObjectId("5e52241bf8647eb59e562090"),
    "Name" : "Chris",
    "Age" : 21,
    "details" : [
        {
            "Subject" : "MySQL",
            "Score" : 78
        },
        {
            "Subject" : "MongoDB",
            "Score" : 45
        }
    ]
}

現在、「details」配列には「MySQL(78点)」と「MongoDB(45点)」の2つの要素が含まれています。

3. aggregate()で条件に一致するキーをリストに追加する

ここからが本題です。aggregate()パイプラインの中で$addFields$filterを組み合わせると、指定した条件(この例ではScoreが70以上)に一致する要素だけをdetails配列に残せます。

> db.demo334.aggregate([
...     { $addFields: {
...         details: {$filter: {
...             input: '$details',
...             as: 'out',
...             cond: {$gte: ['$$out.Score',70 ]}
...         }}
...     }}
... ])

このクエリのポイントは以下の通りです。

$filter:inputで指定した配列「$details」の各要素を「out」という変数名(as)で受け取り、condで記述した条件式によって要素を絞り込みます。
$gte:「$$out.Score」が「70」以上であるかを判定する比較演算子です。条件を満たす要素のみが新しい配列に出力されます。

実行結果

上記のクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e52241bf8647eb59e562090"), "Name" : "Chris", "Age" : 21, "details" : [ { "Subject" : "MySQL", "Score" : 78 } ] }

出力結果を見ると、Scoreが70以上である「MySQL(78点)」の要素だけがdetails配列に残り、条件を満たさなかった「MongoDB(45点)」は除外されていることがわかります。

まとめ

MongoDBで配列フィールドから条件に一致する要素だけを抽出したい場合は、aggregate()パイプライン内で$addFieldsと$filterを組み合わせるのが効果的です。$filterのcondには$gte以外にも$lte(以下)、$eq(等しい)などの比較演算子を自由に指定できるため、さまざまな条件でのデータ絞り込みに活用できます。

  1. MongoDBで特定フィールドの値を合計するクエリの書き方(aggregate + $sum)

    MongoDBでは、aggregate()メソッドと$group・$sum演算子を組み合わせることで、コレクション内のドキュメントに含まれる特定フィールドの値を簡単に合計できます。この記事では、実際のコマンド例を使いながら手順をわかりやすく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。ここではdemo677というコレクションに、Valueフィールドを持つ4件のドキュメントを挿入します。> db.demo677.insertOne({Value:10}); { acknowledged : true, insertedId :

  2. MongoDBでリストをソートして各ドキュメントに順位(Position)を追加する方法

    MongoDBでリストを並べ替えて位置情報を追加するには?リストを並べ替えるには、sort()メソッドを使用します。ここでは、実際にドキュメントを含むコレクションを作成しながら、各ドキュメントに順位(Position)フィールドを追加する手順を解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使ってサンプルデータを挿入したコレクションを作成します。> db.demo581.insertOne({Name:Chris,Score:56});{ acknowledged : true, insertedId : ObjectId(5e91c