【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。
このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。
本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。
サンプルコレクションの作成
まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のドキュメントを用意しました。
[
{
id: "101",
subjectid: [
"102"
]
},
{
id: "102",
subjectid: [
"102"
]
}
]
以下は作成時のスナップショットです。

find()メソッドで全ドキュメントを表示する
find() メソッドを使用すると、コレクション内のすべてのドキュメントを取得して表示できます。
db.collection.find()

上記のクエリを実行すると、次のような出力が得られます。
[
{
"_id": ObjectId("5a934e000102030405000000"),
"id": "101",
"subjectid": [
"102"
]
},
{
"_id": ObjectId("5a934e000102030405000001"),
"id": "102",
"subjectid": [
"102"
]
}
]
$expr・$not・$inを組み合わせた除外クエリ
続いて、 $expr 、 $not 、 $in を組み合わせたクエリを紹介します。
このクエリは、 id フィールドの値が subjectid 配列内に存在するドキュメントを除外し、それ以外のドキュメントのみを取得します。
db.collection.find({
$expr: {
$not:{
$in: [
"$id",
"$subjectid"
]
}
}
})
このクエリを実行すると、次の出力が得られます。
[
{
"_id": ObjectId("5a934e000102030405000000"),
"id": "101",
"subjectid": [
"102"
]
}
]
クエリのポイント解説
出力結果を見ると、 id が "102" のドキュメントは、自身の subjectid 配列に "102" が含まれているために除外され、 id が "101" のドキュメントのみが返されていることがわかります。
各演算子の役割は次のとおりです。
- $in:指定した値が配列内に存在するかどうかを判定する集計演算子です。ここでは
$idの値が$subjectid配列に含まれるかどうかをチェックしています。 - $not:直後の条件式の論理否定を評価します。つまり、値が配列に「含まれていない」場合にtrueとなります。
- $expr:クエリ内で集計式を使用できるようにする演算子です。これにより、同一ドキュメント内のフィールド同士を比較できます。
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id:
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "