MongoDBで英数字混在データを自然な順序で並べ替える方法(numericOrdering活用)
MongoDBで「STU101」や「STU908」のような英数字が混在した文字列を並べ替える場合、通常のソートでは文字コード順に比較されるため、期待通りの結果にならないことがあります。これを解決するには、collationのオプションである numericOrdering: true を設定します。この設定により、文字列中の数値部分が実際の数値として扱われ、自然な順序(ナチュラルソート)で並べ替えが行われます。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成してみましょう。
> db.alphanumericSortDemo.insertOne({"StudentId":"STU1010"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf149adceb9a92e6aa194c")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU1101"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14a2dceb9a92e6aa194d")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU1901"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14a9dceb9a92e6aa194e")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU908"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14aedceb9a92e6aa194f")
}
> db.alphanumericSortDemo.insertOne({"StudentId":"STU101"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf14b2dceb9a92e6aa1950")
}登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。
> db.alphanumericSortDemo.find().pretty();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5ccf149adceb9a92e6aa194c"), "StudentId" : "STU1010" }
{ "_id" : ObjectId("5ccf14a2dceb9a92e6aa194d"), "StudentId" : "STU1101" }
{ "_id" : ObjectId("5ccf14a9dceb9a92e6aa194e"), "StudentId" : "STU1901" }
{ "_id" : ObjectId("5ccf14aedceb9a92e6aa194f"), "StudentId" : "STU908" }
{ "_id" : ObjectId("5ccf14b2dceb9a92e6aa1950"), "StudentId" : "STU101" }ケース1:昇順で並べ替える場合
結果を昇順(小さい順)で取得したい場合は、sort()に 1 を指定し、collationで numericOrdering: true を設定します。
MongoDBで英数字ソートを行うためのクエリは以下のとおりです。
> db.alphanumericSortDemo.find({}).sort({"StudentId" : 1}).collation( { locale: "en_US", numericOrdering: true });実行すると、次のような出力が得られます。数値部分が正しく比較され、「STU101」「STU908」「STU1010」の順に並んでいる点に注目してください。
{ "_id" : ObjectId("5ccf14b2dceb9a92e6aa1950"), "StudentId" : "STU101" }
{ "_id" : ObjectId("5ccf14aedceb9a92e6aa194f"), "StudentId" : "STU908" }
{ "_id" : ObjectId("5ccf149adceb9a92e6aa194c"), "StudentId" : "STU1010" }
{ "_id" : ObjectId("5ccf14a2dceb9a92e6aa194d"), "StudentId" : "STU1101" }
{ "_id" : ObjectId("5ccf14a9dceb9a92e6aa194e"), "StudentId" : "STU1901" }ケース2:降順で並べ替える場合
結果を降順(大きい順)で取得したい場合は、sort()に -1 を指定します。collationの設定方法は昇順の場合と同じです。
MongoDBで英数字の降順ソートを行うためのクエリは以下のとおりです。
> db.alphanumericSortDemo.find({}).sort({"StudentId" : -1}).collation( { locale: "en_US", numericOrdering: true });実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5ccf14a9dceb9a92e6aa194e"), "StudentId" : "STU1901" }
{ "_id" : ObjectId("5ccf14a2dceb9a92e6aa194d"), "StudentId" : "STU1101" }
{ "_id" : ObjectId("5ccf149adceb9a92e6aa194c"), "StudentId" : "STU1010" }
{ "_id" : ObjectId("5ccf14aedceb9a92e6aa194f"), "StudentId" : "STU908" }
{ "_id" : ObjectId("5ccf14b2dceb9a92e6aa1950"), "StudentId" : "STU101" }まとめ
MongoDBで英数字混在の文字列を自然な順序で並べ替えるには、find()やsort()に続けてcollation()メソッドを呼び出し、ロケール(例:"en_US")と numericOrdering: true を指定するだけで実現できます。なお、頻繁にこのソートを行う場合は、コレクション作成時にcollationをデフォルト設定として定義したり、インデックスにcollationを指定しておくことでパフォーマンスを向上させることも可能です。
-
MongoDBで昇順にデータを並べ替える方法【sort()の使い方を解説】
MongoDBで昇順(小さい値から大きい値へ)にデータを並べ替えるには、find()メソッドと組み合わせてsort()メソッドを使用します。昇順で並べ替える場合は、対象のフィールド名に対して「1」を指定するのが基本構文です。db.yourCollectionName.find().sort({yourField: 1});なお、降順(大きい値から小さい値へ)で並べ替えたい場合は、「-1」を指定します。サンプルコレクションの作成実際の動作を確認するため、まずはドキュメントを含むコレクションを作成しましょう。以下のクエリでは、「sortingDemo」というコレクションに数値を持つドキュメントを順
-
MongoDBでコンソールをクリアする2つの方法|ショートカット「Ctrl + L」とコマンド「cls」の使い方
MongoDBのシェル(mongo / mongosh)を使っていると、実行したクエリや結果がどんどん積み重なり、画面が見づらくなることがあります。そんなときに便利なのがコンソールのクリア機能です。MongoDBでは、以下の2つの方法でコンソールをクリアできます。 方法1:キーボードショートカット「Ctrl + L」を使う 最も手軽なのが、キーボードショートカットを使う方法です。次のキーを押すだけで、即座にコンソールをクリアできます。 Ctrl + L このキーを押すと、それまで表示されていたログや実行結果がすべて消え、まっさらな状態になります。Linuxのターミナルなどと同じ操作感なので、