0

ユーザーがメンバーになっているリストを表す配列フィールドを持つmongoDBコレクションがあります。

user { 
  screen_name: string
  listed_in: ['list1', 'list2', 'list3', ...] //Could be more than 10000 elements (I'm aware of the BSON 16MB limits)
}

*listed_in*フィールドを使用してメンバーリストを取得しています

db.user.find({'listed_in': 'list2'});

また、特定のユーザーを照会して、そのユーザーが特定のリストのメンバーであるかどうかを知る必要があります

var user1 = db.findOne({'screen_name': 'user1'});

この場合、すべてのメンバーを含む*listed_in*フィールドを取得します。

私の質問は:mongoDBのカスタムフィールドを事前に計算する方法はありますか?user1.isInList1user1.isInList2のようなフィールドを取得できる必要があります

今のところ、ユーザーが「list1」のメンバーであるかどうかを知るために* listed_in *配列を反復処理することにより、クライアント側でそれを行う必要がありますが、*listed_in*には1000個の要素が含まれる可能性があります。

4

1 に答える 1

0

私の質問は:mongoDBのカスタムフィールドを事前に計算する方法はありますか?

あまり。MongoDBには、「計算列」の概念はありません。したがって、探しているクエリは存在しません。

今のところ、ユーザーが「list1」のメンバーであるかどうかを知るために* listed_in *配列を反復処理することにより、クライアント側でそれを行う必要がありますが、*listed_in*には数千の要素が含まれる可能性があります

あなたの場合、基本的にクライアント側のforループをサーバーにプッシュしようとしています。ただし、一部のプロセスはまだforループを実行する必要があります。そして率直に言って、10kのアイテムをループすることは、クライアントにとってもサーバーにとってもそれほど多くの作業ではありません。

ここでの唯一の本当の節約は、ネットワーク上の余分なデータを防ぐことです。

そのネットワークトラフィックを本当に節約したい場合は、データモデルを再構築する必要があります。この再構築には、読み取りと書き込みの2つのクエリが含まれる可能性がありますが、ネットワーク上のデータは少なくなります。しかし、それはトレードオフです。

于 2011-12-27T00:33:08.180 に答える