0

簡単な質問ですが、mongo が次のデータにインデックスを作成できるかどうか知っていますか?

{
    prices: {
        price1: 0.90,
        price2: 0.12,
        price3: 0.13
    }
}

このようにインデックスを作成したいと思いますensureIndex({prices:1})が、すべての価格とその値が含まれるかどうかはわかりません。

標準の配列アプローチではなくこの方法でデータを配置する必要がある理由は、選択された価格バージョンに基づいてソートできるようにしたいからsort({prices.price:1})です。

何か案は?

乾杯

4

2 に答える 2

0

わかりました私は今理解したと思います。コレクション内のすべてのドキュメントを特定の価格バージョンで並べ替えます。

位置による並べ替えを行うことができないため、これはサブドキュメントではうまく機能しません。

find({price.version:1}).sort({price.$.version: 1})

そのため、これはルート ドキュメント内のフラットな構造の方が適しています。実際、サブドキュメントに配置する例では、実際にインデックス作成を困難にするデータをグループ化する以外に実際の用途はありません。

そのため、フィールドをルート ドキュメントに射影することをお勧めします。@Philippの回答を使用して、ここで集計フレームワークを使用して何か凝ったことを行うことができますが、このクエリは非常に頻繁に実行され、おそらくより大きなワーキングセットで実行される可能性があるようです。

したがって、新しいドキュメント構造は次のようになります。

{
        price1: 0.90,
        price2: 0.12,
        price3: 0.13
}

これは、SQL と MongoDB の両方でこの種のことを行う方法であり、すべてのフィールドの複合インデックスでうまく機能します。

もちろん、MongoDB はスキーマレスであるため、アプリに新しい価格を追加する場合でも、データベースの維持について心配する必要はありません。

于 2012-11-16T10:43:31.437 に答える
0

そのデータを処理する場合ensureIndex({prices:1})、price1、price2、および price3 の正確な組み合わせに対してインデックスを作成します。そのため、インデックスは、3 つの価格すべてが完全に一致するものを検索した場合にのみ検索可能になります (検索または潜在的な結果に追加の価格はありません)。

ただし、次のようにデータを構造化すると、個々の価格を検索できます。

{
    prices: [
         {version: 1, value: 0.99},
         {version: 2, value: 0.12},
         {version: 3, value: 0.13}
    ]
}

次に、価格.バージョン、価格.値、および親ドキュメントからの一意の識別子を含む複合インデックスを追加できます。{prices.version:1}そうすれば、またはで製品をすばやく検索できます{prices.version:2}

mongodb のインデックスのドキュメントも参照してください。

于 2012-11-16T10:26:50.850 に答える