2011-01-29 25 views
0

私はMongoDBを使用して多数の情報を格納しており、インデックス付き配列で値を検索する必要があります。MongoDB配列インデックス検索

は、ここにスキーマです:ドキュメント内の他の値があります

{ "common_name" : { "name" : "thename", "type" : "thetype" } } 

が、これは私が探してるだけです。

だから、私はこのような何かが働くだろう考え出し:

db.collection.find({common_name:{$in:"thename"}}) 

(シェルに)しかし、私は戻って何を取得。

これはここで行われていることとまったく同じように見えます。 http://www.php.net/manual/en/mongo.queries.php - しかし、私は戻って何かを得ることはできません。

(4まで)私は

db.collection.find({"common_name.name":"thename"}}) 

を試みたし、それがインデックスに複数のノードを検索するための期待通りに動作しますが、それは基本的に各サブカテゴリのための$またはインデックスを定義する、醜い得ることができ、私の質問時間を4倍にしました。これはオートコンプッタに電力を供給しているので、私はそれを行うことはできません。

奇妙なことに、次のいずれかの任意の文書を返しません:

db.collection.find({"common_name":{"name":"thename"}}) 

私の理解に、上記のクエリとまったく同じものはどれ。

私はかなりモンゴーを新しくしています。

このデータへの最速のアクセス方法(アンカー正規表現を使用して)についてのアイデアはありますか?

私は単にリレーショナルテーブルを使うことができますが、MongoのようなNoSQLシステムの目的を破ることはできませんか?

答えて

2

問題は、配列がないことです。配列は{ "common_name" : [ "name1", "name2", "name3" ] }

のようになります。そのような構造を持つMongoは、配列の要素を単一のインデックスでインデックスし、配列から単一の項目を含む文書をすばやく見つけることができます。

は配列を使用して、オフセットを定義するだけで必要なものにすることができます。 [0]は名前、[1]はタイプなどです。これで、すべての文書をすばやく見つけることができます。

あなたはという名前のフィールドにデータを保持することに加えでこのを行うことができます(そのストレージを増加させる明確けどはお勧めしません)。

あなたのオートコンプリートを使用すると、代わりにあなたがオートコンプリートのためだけに使用して別のコレクションを構築するために仕事を地図削減実行することができ、コレクションに追加された最新の文書と完全に最新である必要はありません場合。マップステップは、ドキュメント内の個々の名前フィールドのそれぞれに対して発行されます(したがって、排出後に4倍のドキュメントが作成されます)。また、reduceステップでは、各フィールドの名前の数がカウントされます(したがって、 。結果のコレクションに名前とカウントを付けて索引付けすると、オートコンプリートが最も一般的な名前を最初に推薦できるようになります。

+0

ああ、私はそれが問題かもしれないと心配していました。スキーマを変更してそのように動作させます。私はhttp://www.php.net/manual/en/mongo.queries.phpのphp docsを誤解しているか、間違っています。ありがとう! – Jesse

+0

うわー、ちょうど配列に変換した後、いくつかのexplain()を実行しました。アンカー付きの正規表現で配列を検索すると55msのコストがかかります。インデックスを作成した後、2になります。 – Jesse

+0

@Jesse - インデックスを一度忘れました。コレクションに約100万のドキュメントがあるまで気付かなかった!インデックスを追加したところ、数ミリ秒に戻りました。 –

0

db.collection.find({"common_name":{"name":"thename"}})私の理解によれば、上記のクエリとまったく同じことです。

common_nameの値がちょうどname: thename}になる場合にのみ一致しますので、それはありませんいいえ、あなたは$elemMatch演算子を望んでいません。

関連する問題