0

アクセスキーを介してアイテムを他のユーザーと共有できるシステムを開発しています。以下に示すように、アクセスキーをオブジェクト内のフィールドとして保存していshareinfoます (アイテムのドキュメント内に埋め込まれています)。

shareinfo:{
    ........
    <nth key>: <permissions object - may be complex and large>
    ........
}

アイテムがアクセスされると、shareinfo.key をチェックして、有効かどうかを調べます。

現在、キーを一覧表示するには、(Java で) shareinfo オブジェクト全体をメモリにロードし、その上でkeySet()を実行してキーを取得して返しますが、残りのデータは無駄になります。

ここに問題があります: キーのリスト (つまり、オブジェクト フィールド名) を付随するデータなしで取得したいのです (パーミッション オブジェクトが著しく大きい場合があるため)。

そのようなクエリのmongodbドキュメントにはクエリが見つかりませんでした。可能かどうか知りたいのですが?または、フィールド値を伴わずにフィールド名のリストをアプリケーションにロードする最適化された方法はありますか?

4

2 に答える 2

7

mongodb シェルを使用して既存の mongodb データベースの構造を理解しようとしたときに、同じ問題が発生しました。次に、JavaScript 関数 Object.keys() を使用して、オブジェクト フィールドの配列を取得できることがわかりました。(MongoDb 2.4.2 でテスト済み)

Object.keys(db.collection.findOne())
于 2013-04-26T06:20:52.810 に答える
4

MongoDB にはスキーマレス設計が採用されています。つまり、どのドキュメントにも、他のドキュメントとは異なるフィールドが含まれている可能性があります。すべてのドキュメントのすべてのフィールドの完全なリストを取得するには、コレクション内のすべてのドキュメントを走査し、各フィールドを列挙する必要があります。適度なサイズのコレクションの場合、これは非常にコストのかかる操作になります。

これをより簡単にするヘルパーがいくつかあります: Varietyschema.js です。どちらも、検査するドキュメントを制限することができ、カバレッジについてもレポートします。どちらもコレクションに対して map/reduce を実行することになりますが、少なくとも自分で作成するよりは簡単です。

于 2012-09-14T04:52:14.930 に答える