0

私は自分のドキュメントに失敗したシンプルな構造を持っています:

{regId: 1, data: {[{val: 123456}, {val: 324234}, {val: 4353453}, .......]}}

データ要素配列には 30 ~ 60 のサブドキュメントが含まれる場合があり、現在、コレクションには約 53000 のドキュメントがありますが、さらに大きくなる予定です。

val の配列 INPUT, [11563012,11563011,82867218,83866648, ....] が与えられた場合、少なくとも 3 つの一致する data.val を持つドキュメントを返したいと考えています。現在、$in 修飾子と js 関数 (countMatches) を呼び出す $where 句を使用してクエリを実行しています。$in 修飾子は、IMPUT の項目を少なくとも 1 つ含むすべてのドキュメントを返します。$where 関数は、各 document.date を反復処理し、INPUT 内の一致をカウントして、しきい値を超えるドキュメントのみを返します。

db.foo.find({"data.val": {$in: [11563012,11563011,82867218,83866648,.......]}, $where: "countMatches(this.data, [11563012,11563011,82867218,83866648,......])>=3"}).count();

同様の質問 (http://groups.google.com/group/mongodb-user/browse_thread/thread/fa291575fd47c010) は、「サブドキュメント」で一致をカウントする唯一の方法は、$ で js 関数を使用することのいずれかであることを示しているようです。 where 句または group() 集計関数を使用します。

私の質問は、サブドキュメントで「ヒット」をカウントするためのより良い方法はありますか? これは意味的に「タグ付き」ドキュメントの検索に似ています。つまり、[tag1、tag2、tag3、tag4、.....] のタグが最も一致するドキュメントを返します。

4

1 に答える 1

0

あなたは使用する必要があります$where、これを行うためのより良い方法はありません。

$inフィルタがコレクションの大部分を返す場合、このソリューションではスケーリングできないことに注意してください...(他のソリューションではスケーリングが困難になります)

于 2011-07-06T21:46:32.187 に答える