MongoDBで最後のN件のレコードを取得する方法
MongoDBでコレクションから最後のN件のレコードを取得したい場合、limit()メソッドとsort({$natural:-1})を組み合わせて使用します。$natural:-1を指定してソートすることで、ドキュメントを挿入順とは逆順(自然順の逆)に並べ替えられ、その状態でlimit()を使うことで末尾のレコードだけを効率的に取り出せます。
基本構文
MongoDBで最後のN件のレコードを取得するための基本的な構文は以下の通りです。
db.yourCollectionName.find().sort({$natural:-1}).limit(yourValue);この構文では、まずfind()ですべてのドキュメントを取得し、sort({$natural:-1})で挿入順の逆に並べ替え、最後にlimit()で指定した件数だけ結果を絞り込みます。
サンプルコレクションの作成
それでは、実際に動作を確認するために、ドキュメントを含むコレクションを作成してみましょう。以下のクエリを実行して、「getLastNRecordsDemo」というコレクションに従業員名のデータを順番に挿入していきます。
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Maxwell"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf3d6fd07954a4890689")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf496fd07954a489068a")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf4e6fd07954a489068b")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf546fd07954a489068c")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf596fd07954a489068d")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Mike"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf606fd07954a489068e")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf686fd07954a489068f")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"James"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf6f6fd07954a4890690")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Jace"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf756fd07954a4890691")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"Ramit"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf7d6fd07954a4890692")
}
> db.getLastNRecordsDemo.insertOne({"EmployeeName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6ecf8d6fd07954a4890693")
}登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。実行するクエリは以下の通りです。
> db.getLastNRecordsDemo.find().pretty();
実行すると、次のような出力が得られます。合計11件のドキュメントが挿入順に格納されていることがわかります。
{ "_id" : ObjectId("5c6ecf3d6fd07954a4890689"), "EmployeeName" : "Maxwell" }
{ "_id" : ObjectId("5c6ecf496fd07954a489068a"), "EmployeeName" : "Carol" }
{ "_id" : ObjectId("5c6ecf4e6fd07954a489068b"), "EmployeeName" : "Bob" }
{ "_id" : ObjectId("5c6ecf546fd07954a489068c"), "EmployeeName" : "Sam" }
{ "_id" : ObjectId("5c6ecf596fd07954a489068d"), "EmployeeName" : "Robert" }
{ "_id" : ObjectId("5c6ecf606fd07954a489068e"), "EmployeeName" : "Mike" }
{ "_id" : ObjectId("5c6ecf686fd07954a489068f"), "EmployeeName" : "Chris" }
{ "_id" : ObjectId("5c6ecf6f6fd07954a4890690"), "EmployeeName" : "James" }
{ "_id" : ObjectId("5c6ecf756fd07954a4890691"), "EmployeeName" : "Jace" }
{ "_id" : ObjectId("5c6ecf7d6fd07954a4890692"), "EmployeeName" : "Ramit" }
{ "_id" : ObjectId("5c6ecf8d6fd07954a4890693"), "EmployeeName" : "David" }最後のN件を取得するクエリの実行
それでは、$naturalとlimit()を組み合わせて、コレクションから最後の7件のレコードを取得してみましょう。実行するクエリは以下の通りです。
> db.getLastNRecordsDemo.find().sort({$natural:-1}).limit(7);実行結果は次の通りです。出力を見ると、最後に挿入した「David」から順に、末尾側の7件のレコードが新しい順に表示されていることが確認できます。
{ "_id" : ObjectId("5c6ecf8d6fd07954a4890693"), "EmployeeName" : "David" }
{ "_id" : ObjectId("5c6ecf7d6fd07954a4890692"), "EmployeeName" : "Ramit" }
{ "_id" : ObjectId("5c6ecf756fd07954a4890691"), "EmployeeName" : "Jace" }
{ "_id" : ObjectId("5c6ecf6f6fd07954a4890690"), "EmployeeName" : "James" }
{ "_id" : ObjectId("5c6ecf686fd07954a489068f"), "EmployeeName" : "Chris" }
{ "_id" : ObjectId("5c6ecf606fd07954a489068e"), "EmployeeName" : "Mike" }
{ "_id" : ObjectId("5c6ecf596fd07954a489068d"), "EmployeeName" : "Robert" }まとめ
MongoDBで最後のN件のレコードを取得するには、find().sort({$natural:-1}).limit(N)という組み合わせが基本となります。$natural:-1による逆順ソートとlimit()による件数制限により、シンプルな記述で目的のデータを取得できます。なお、タイムスタンプや自動増分するフィールドが存在する場合は、それらのフィールドでソートする方法も検討するとよいでしょう。
-
C#でIPアドレスを取得する方法【サンプルコード付きで解説】
IPアドレス(Internet Protocol Address)とは、ネットワークハードウェアに割り当てられる識別用の番号です。コンピュータをネットワーク上の他のデバイスや世界中のデバイスと接続するために利用され、数字や文字で構成されます。インターネットに接続されるすべてのデバイスには固有のIPアドレスが必要となるため、全世界で数十億個規模のIPアドレスが必要です。この需要に応えるために登場したのが、新しいIPバージョンであるIPv6です。プライベートIPアドレスとはプライベートIPアドレスは、家庭や企業のネットワークに接続されたデバイスに割り当てられるアドレスです。同じISP(インターネッ
-
Pythonでリストの最後の要素を取得する3つの方法
このチュートリアルでは、Pythonのリストから最後の要素を取得するさまざまな方法を解説します。代表的な3つの手法を、コード例と実行結果とともに順番に見ていきましょう。1. インデックスを使う方法リストの長さを利用して、最後の要素のインデックス(リストの長さ - 1)を計算することで、最後の要素にアクセスできます。以下のコードを見てみましょう。コード例# リストの初期化 numbers = [1, 2, 3, 4, 5] # 最後の要素を出力 print(fLast element:- {numbers[len(numbers) - 1]})実行結果上記のプログラムを実行すると、次の出力が得ら