MongoDBですべてのドキュメントの配列から最新のエントリを取得する方法
MongoDBですべてのドキュメントの配列から最新のエントリを取得する方法
すべてのドキュメントにわたって配列内の最新のエントリを取得したい場合は、aggregate()メソッドを使用します。まずは、サンプルとなるドキュメントを含むコレクションを作成してみましょう。
> db.demo179.insertOne(
...{
... "Name":"Chris",
... "Details": [
... {
... "Id":101,
... "Subject":"MongoDB"
... },
... {
... "Id":102,
... "Subject":"MySQL"
... }
... ]
...}
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3980299e4f06af551997f9")
}
> db.demo179.insertOne(
...{
... "Name":"David",
... "Details": [
... {
... "Id":103,
... "Subject":"Java"
... },
... {
... "Id":104,
... "Subject":"C"
... }
... ]
...}
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e39802a9e4f06af551997fa")
}
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo179.find().pretty();
上記のコマンドを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e3980299e4f06af551997f9"),
"Name" : "Chris",
"Details" : [
{
"Id" : 101,
"Subject" : "MongoDB"
},
{
"Id" : 102,
"Subject" : "MySQL"
}
]
}
{
"_id" : ObjectId("5e39802a9e4f06af551997fa"),
"Name" : "David",
"Details" : [
{
"Id" : 103,
"Subject" : "Java"
},
{
"Id" : 104,
"Subject" : "C"
}
]
}
最新のエントリを抽出する集計クエリ
以下は、すべてのドキュメントにわたって配列内の最新のエントリを検索するためのクエリです。
> db.demo179.aggregate([
... { "$unwind": "$Details" },
... { "$sort": { "Details.Id": -1 } },
... { "$limit": 2 },
... {
... "$group": {
... "_id": "$Details.Id",
... "Name" : { "$first": "$Name" },
... "Details": { "$push": "$Details" }
... }
... },
... {
... "$project": {
... "_id": 0, "Name": 1, "Details": 1
... }
... }
...])
このクエリでは、次の集計パイプラインステージが使用されています。
- $unwind:Details配列を展開し、各要素を個別のドキュメントとして扱えるようにします。
- $sort:Details.Idの値を降順(-1)に並べ替え、新しいエントリを先頭に持ってきます。
- $limit:上位2件のみを取得対象とします。必要な件数に応じて変更可能です。
- $group:Idごとに結果をグループ化し、$firstで名前を、$pushで詳細情報をまとめます。
- $project:_idフィールドを除外し、NameとDetailsのみを出力するように整形します。
このクエリを実行すると、次のような出力が得られます。
{ "Name" : "David", "Details" : [ { "Id" : 103, "Subject" : "Java" } ] }
{ "Name" : "David", "Details" : [ { "Id" : 104, "Subject" : "C" } ] }
このように、aggregate()メソッドと各種パイプラインステージを組み合わせることで、複数のドキュメントにまたがる配列データの中から、条件に合った最新のエントリを効率的に取り出すことができます。
-
MongoDBで配列フィールドを使ってドキュメントをフィルタリングする方法($elemMatch演算子の使い方)
MongoDBで配列内の要素に基づいてドキュメントをフィルタリングしたい場合、$elemMatch 演算子を使用します。$elemMatch は、指定した条件を満たす要素を少なくとも1つ含む配列フィールドを持つドキュメントを照合するための演算子です。この記事では、実際にコレクションを作成し、$elemMatch を使って配列条件でドキュメントを絞り込む手順を解説します。サンプルコレクションの作成まず、テスト用のコレクションにドキュメントを挿入してみましょう。ここでは、学生の名前と点数(Marks)を持つ details 配列を含むドキュメントを作成します。> db.demo453.ins
-
MongoDBで配列内の一致オブジェクト数に基づいてドキュメントを検索する方法
MongoDBでは、$where演算子とJavaScript関数を組み合わせることで、配列内に存在する一致したオブジェクトの数に基づいてドキュメントを検索できます。この記事では、具体的なサンプルを通じてその方法を解説します。サンプルデータの準備まずは、ドキュメントを含むコレクションを作成しましょう。> db.demo694.insertOne( ... { ... details : ... [ ... { ... Name : Chris, ... Age:21 ...