サポートしたいクエリに応じて、2 つの選択肢が思い浮かびます。ただし、数百 MB のデータ サイズの場合、すべてを RAM で実行し、MongoDB を単なるブロブ ストアとして使用するよりも遅くなると思います。
1)各次元を別々のオブジェクトに入れることができます:
FirstLevel {
"_id" : ObjectId("..."),
"Children" : [ ObjectId("..."), ... ]
// list of vector ids (of the second level)
}
おそらくあまり良い解決策ではありません。保存できるアイテムの数にはまだ制限がありますが、 が大きなオブジェクトである (16M / id size)^3
場合は、大まかに、(リーフ内で) はるかに小さいため、その数はかなり大きくする必要があります。Foo
ツリーをたどる必要があるため、アクセスはかなり遅くなります。ノードとリーフのデータ形式は多少異なります。ただし、非常に拡張可能です (任意の次元)。
2) データは 3 次元であるため、「真の 3 次元」で保存できます。
Data {
Coords : { "x" : 121, "y" : 991, "z" : 12 },
ActualData : { /* Serialized Foo */ }
}
タプルで複合インデックスを使用すると、 「すべてを選択してから並べ替える」{x, y, z}
などの操作を除いて、次元スライスが非常にうまくサポートされます。このアプローチにはかなりのオーバーヘッドが伴い、おそらくカスタム (デ) シリアライザーが必要になります。C++ ドライバーはわかりませんが、C# では非常に簡単に実装できます。z = 13
x
これにより、ジャグ配列も十分にサポートされます。
2a) 2) のオーバーヘッドが必要ない場合は、座標を 1 つのlong
. これは、MongoDB が地理空間インデックスに対して行うgeohashingに似ています。
座標のスライスのクエリはビット マスク操作であり、残念ながらクエリではまだサポートされていません ($bit
更新でのみ機能します)。ただし、投票することはできます。
たぶん、あなたの目的のためにジオハッシュを悪用することもできますが、それはむしろ実験的なものです.