2

MongoDBに次のようなドキュメントがあります

{ 
    "_id": "...",
    "ranks":[
    {"pos": 1,"type":"some type"},
    {"pos": 56,"type":"other type"},
    ...
    ]
}

この埋め込みドキュメントで、「ranks.type」が「sometype」と一致するすべてのアイテムを検索して「pos」で並べ替えたいと思います。

SQLでは、次のようにします(tables documentとdocument_rank)

SELECT
    D.* 
FROM
    document D 
JOIN
    document_rank DR ON DR.document_id = D.id
WHERE
    DR.type="some type" 
ORDER BY 
    DR.pos

ランクを埋め込むことでこれを実行できるかどうか、またはランクをドキュメントにリンクする必要があるかどうかを尋ねています。私の実験は、私がリンクしなければならないことを示しています。

4

1 に答える 1

3

単一のドキュメントが返されるため、並べ替えについて質問するのは意味がありません。単一のドキュメント内の配列に埋め込まれた要素を並べ替えるという概念はありません。

ただし、2.1(開発バージョン)以降、集約フレームワークでは、ドキュメントと配列を選択し$unwind、結果のドキュメントを並べ替えることで、必要な処理を実行できます(必要に応じて、を使用して結果の一般的な形状を変更することもできます$project)。

db.coll.aggregate([
      {$unwind:"$ranks"},
      {$match:{"ranks.type":"some type"}},
      {$sort:{"ranks.pos":1}}
])

これらは完全な元のドキュメントではなく、それぞれに1つの「ランク」埋め込み要素しかないドキュメントであることに注意してください。そのため、埋め込みフィールドで並べ替えることができます。

この種の操作がアプリケーションに不可欠である場合、使用しているスキーマ設計は最良の選択ではない可能性があります。スキーマを変更すると大幅に簡素化される場合に備えて、アプリケーションがこれらのオブジェクトに対して持つクエリのタイプとアクセスパターンを確認することをお勧めします。

于 2012-07-14T22:24:44.890 に答える