JavaScript、Node.js、およびMongoDBを使用したオブジェクトの配列の検索
MongoDBでオブジェクトの配列を検索する方法
$elemMatch クエリ演算子を使用する
$elemMatch 演算子は、配列内のオブジェクトに一致する要素を見つけるために使用できます。 次の例では、grades
配列に grade
フィールドが 80 以上のオブジェクトを含むドキュメントを検索しています。
const query = {
grades: { $elemMatch: { grade: { $gte: 80 } } }
};
const results = await db.collection.find(query);
$in クエリ演算子を使用する
$in 演算子は、配列内の値と一致するドキュメントを見つけるために使用できます。 次の例では、grades
配列に "first" または "second" という値を含むドキュメントを検索しています。
const query = {
grades: { $in: ["first", "second"] }
};
const results = await db.collection.find(query);
$size 演算子は、配列のサイズと一致するドキュメントを見つけるために使用できます。 次の例では、grades
配列に 2 つの要素を含むドキュメントを検索しています。
const query = {
grades: { $size: 2 }
};
const results = await db.collection.find(query);
$where 演算子は、JavaScript式を使用してドキュメントを検索するために使用できます。 次の例では、grades
配列のすべての要素の合計が 150 以上のドキュメントを検索しています。
const query = {
$where: function() {
let total = 0;
for (const grade of this.grades) {
total += grade.grade;
}
return total >= 150;
}
};
const results = await db.collection.find(query);
- 配列内のオブジェクトを検索するには、ドット表記を使用できます。 たとえば、
grades.grade
はgrades
配列内のgrade
フィールドを参照します。 - 配列内のオブジェクトをソートするには、
$sort
クエリ演算子を使用できます。
// モジュールのインポート
const MongoClient = require('mongodb').MongoClient;
// データベースへの接続
const mongoURL = 'mongodb://localhost:27017';
const dbName = 'my_database';
const collectionName = 'my_collection';
// 検索クエリ
const query = {
grades: { $elemMatch: { grade: { $gte: 80 } } }
};
// データベースへの接続とクエリの実行
MongoClient.connect(mongoURL, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err;
const db = client.db(dbName);
const collection = db.collection(collectionName);
collection.find(query, (err, results) => {
if (err) throw err;
console.log(results); // 検索結果を出力
client.close();
});
});
このコードを実行するには、次の手順が必要です。
- Node.jsをインストールする。
- MongoDBをインストールして実行する。
- コードをファイルに保存する。
- 次のコマンドを使用してコードを実行する。
node filename.js
forEach ループを使用して、配列内の各オブジェクトをループ処理し、条件に一致するオブジェクトを見つけることができます。 次の例では、grades
配列に grade
フィールドが 80 以上のオブジェクトを含むドキュメントを検索しています。
const results = [];
for (const doc of collection.find()) {
for (const grade of doc.grades) {
if (grade.grade >= 80) {
results.push(doc);
break;
}
}
}
console.log(results);
filter() メソッドを使用する
filter() メソッドを使用して、条件に一致するオブジェクトを含む新しい配列を作成できます。 次の例では、grades
配列に grade
フィールドが 80 以上のオブジェクトを含むドキュメントを検索しています。
const results = collection.find().filter(doc => {
return doc.grades.some(grade => grade.grade >= 80);
});
console.log(results);
const result = collection.find(doc => {
return doc.grades.some(grade => grade.grade >= 80);
});
console.log(result);
javascript arrays node.js