MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

【MongoDB】コレクション内のドキュメントを並べ替える方法|$natural演算子の使い方を解説

MongoDBにおけるドキュメントの並び順と$natural演算子

MongoDBでは、コレクション内のドキュメントの並び順を$natural演算子によって制御できます。find()メソッドでドキュメントを取得すると、通常は挿入された順序(自然順序)のまま返されます。このデフォルトの並び順こそが、$natural順序に相当します。

$naturalソートの基本構文

コレクション内のドキュメントを挿入順で取得するには、次のように記述します。

db.yourCollectionName.find().sort({ "$natural": 1 });

"$natural": 1 を指定すると挿入順そのままに、"$natural": -1 を指定すると挿入順の逆(降順)でドキュメントを取得できます。なお、WiredTigerストレージエンジン環境では更新操作などにより物理的な配置が変わる場合があるため、厳密な挿入順の保証が必要な場面では別途タイムスタンプなどのフィールドを持たせるのが安全です。

サンプルコレクションの作成

それでは、実際に動作を確認するためのコレクションを作成しましょう。以下のクエリで、ユーザーのスコア情報を持つドキュメントを1件ずつ挿入します。

> db.orderDocsDemo.insertOne({"UserScore":87});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9531a316f542d757e2b44b")
}
> db.orderDocsDemo.insertOne({"UserScore":98});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9531a816f542d757e2b44c")
}
> db.orderDocsDemo.insertOne({"UserScore":99});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9531b216f542d757e2b44d")
}
> db.orderDocsDemo.insertOne({"UserScore":67});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9531b716f542d757e2b44e")
}
> db.orderDocsDemo.insertOne({"UserScore":78});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9531bd16f542d757e2b44f")
}
> db.orderDocsDemo.insertOne({"UserScore":91});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9531c416f542d757e2b450")
}
> db.orderDocsDemo.insertOne({"UserScore":86});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9531c816f542d757e2b451")
}

コレクション内の全ドキュメントを表示する

find()メソッドを使えば、コレクション内のすべてのドキュメントを一覧表示できます。

> db.orderDocsDemo.find();

実行結果は以下のとおりです。

{ "_id" : ObjectId("5c9531a316f542d757e2b44b"), "UserScore" : 87 }
{ "_id" : ObjectId("5c9531a816f542d757e2b44c"), "UserScore" : 98 }
{ "_id" : ObjectId("5c9531b216f542d757e2b44d"), "UserScore" : 99 }
{ "_id" : ObjectId("5c9531b716f542d757e2b44e"), "UserScore" : 67 }
{ "_id" : ObjectId("5c9531bd16f542d757e2b44f"), "UserScore" : 78 }
{ "_id" : ObjectId("5c9531c416f542d757e2b450"), "UserScore" : 91 }
{ "_id" : ObjectId("5c9531c816f542d757e2b451"), "UserScore" : 86 }

$natural順序でドキュメントを取得する

コレクション内のドキュメントを自然順序で並べ替えて取得するクエリは、次のとおりです。

> db.orderDocsDemo.find().sort({ "$natural": 1 });

出力結果:

{ "_id" : ObjectId("5c9531a316f542d757e2b44b"), "UserScore" : 87 }
{ "_id" : ObjectId("5c9531a816f542d757e2b44c"), "UserScore" : 98 }
{ "_id" : ObjectId("5c9531b216f542d757e2b44d"), "UserScore" : 99 }
{ "_id" : ObjectId("5c9531b716f542d757e2b44e"), "UserScore" : 67 }
{ "_id" : ObjectId("5c9531bd16f542d757e2b44f"), "UserScore" : 78 }
{ "_id" : ObjectId("5c9531c416f542d757e2b450"), "UserScore" : 91 }
{ "_id" : ObjectId("5c9531c816f542d757e2b451"), "UserScore" : 86 }

上記の出力結果を見ると、ドキュメントが挿入したときとまったく同じ順序で取得できていることが確認できます。

特定のフィールドの値でソートする場合

一方、特定のフィールドの値に基づいてドキュメントを整列させたい場合は、sort()メソッドにフィールド名を指定します。ここでは「UserScore」をキーに昇順で並べ替えてみましょう。

> db.orderDocsDemo.find().sort({ "UserScore": 1 });

出力結果:

{ "_id" : ObjectId("5c9531b716f542d757e2b44e"), "UserScore" : 67 }
{ "_id" : ObjectId("5c9531bd16f542d757e2b44f"), "UserScore" : 78 }
{ "_id" : ObjectId("5c9531c816f542d757e2b451"), "UserScore" : 86 }
{ "_id" : ObjectId("5c9531a316f542d757e2b44b"), "UserScore" : 87 }
{ "_id" : ObjectId("5c9531c416f542d757e2b450"), "UserScore" : 91 }
{ "_id" : ObjectId("5c9531a816f542d757e2b44c"), "UserScore" : 98 }
{ "_id" : ObjectId("5c9531b216f542d757e2b44d"), "UserScore" : 99 }

まとめ

$natural演算子を使えば、MongoDBのコレクションからドキュメントを挿入順(またはその逆順)で取得できます。数値や日付などの特定条件による整列が必要な場合は、sort()メソッドに対象フィールドと昇順(1)・降順(-1)を指定するのが基本です。用途に応じて両者を使い分けることで、柔軟なデータ取得を実現できます。

  1. MongoDBコレクションから重複を削除する方法|unique制約の使い方を解説

    MongoDBコレクションから重複を削除する方法MongoDBのコレクションに重複データが登録されるのを防ぎたい場合は、ユニーク制約(unique: true)を設定するのが最も基本的かつ確実な方法です。対象フィールドにユニークインデックスを作成しておくことで、同じ値を持つドキュメントの挿入が自動的に拒否され、コレクション内に重複が存在しない状態を維持できます。基本構文以下のように、コレクション名とフィールド名を指定してユニークインデックスを作成します。「dropDups: true」を付けることで、インデックス作成時点で既に存在していた重複ドキュメントも削除され、各グループの最初の1件のみが

  2. MongoDBでタイムスタンプの降順にデータを並べ替える方法

    MongoDBでタイムスタンプを基準にデータを並べ替えたい場合には、sort()メソッドを使用します。降順(新しい日付が先頭)で並べ替えるには、ソート条件として -1 を指定します。ここでは、実際にコレクションを作成してドキュメントを挿入し、タイムスタンプの降順に並べ替える手順を順番に見ていきましょう。サンプルデータの作成まず、insertOne()メソッドを使って、タイムスタンプを持つドキュメントを複数件コレクションに挿入します。> db.demo737.insertOne({timestamp : new ISODate(2020-04-01 )}); { acknowledg