2

実行しているMongoDBクエリがありますが、必要なレコードをプルバックしていません。カテゴリと説明(contains / like正規表現を介して)の2つでフィルタリングします。カテゴリに基づいて検索すると、そのカテゴリのすべてのレコード(問題のレコードを含む)が返されますが、説明を入力すると、そのレコードを元に戻すことができません。説明テキストに一致する他のレコードが返されますが、何らかの理由で、何を入力しても、この1つのレコードを説明条件で返すことができません。それは非常に奇妙です。

MongoDBでそのようなことをデバッグするにはどうすればよいですか?私のクエリは非常に単純です:

var match = {};

var category = "hardware"
if (category)
    match.Category = category;

var searchText = "ceramic"
if (searchText)
{
    match.Description = new RegExp("/.*" + searchText + ".*/");
}

collection.find(match).toArray(function(err, items)
{
    response.send(items);
});

私が取り戻そうとしているアイテムはハードウェアカテゴリにあり、searchTextが""のときに戻ってきます。説明に「ceramic」という単語が含まれていますが、searchTextが「ceramic」(またはその説明にある他の任意の数の単語)の場合、そのアイテムは返されません。説明に「セラミック」という言葉が含まれている他の人はそうしますが、そうではありません。もちろん、そのアイテムの構造は他のアイテムと同じです。それは本当に試合に合格するはずです。

大文字と小文字は正しく(「セラミック」は説明とフィルターの両方ですべて下がっています)、検索で大文字と小文字を区別しないように/iも試しました。

では、このクエリが非常に明確に一致するアイテムを生成できない理由をどのように見つけることができますか?

4

1 に答える 1

2

まあ、これはおそらくここでの原因ではありませんが、その正規表現は少し奇妙です。これを指定できるはずです:

match.Description = new RegExp("/" + searchText + "/");

手段は、.*任意の文字を何度でも一致させます-テキストまですべてを貪欲に一致させ、それをより複雑な正規表現の一部として使用しようとしない限り、必要ありません。

デバッグに関しては、クエリが MongoDB でどのように表示されるかを把握し、それがシェルで機能することを確認します。簡単なサンプル ドキュメントを次に示します。

{
    "_id" : ObjectId("503fab7bf6a278b7bda257d2"),
    "category" : "hardware",
    "Description" : "blah ceramic blah"
}

そして、これは一致します:

mongos> db.foo.find({"Description" : /ceramic/}).pretty()
{
    "_id" : ObjectId("503fab7bf6a278b7bda257d2"),
    "category" : "hardware",
    "Description" : "blah ceramic blah"
}

また、プロファイリングをオンにして、プログラムが MongoDB に何を送信しているかを監視することもできます (プロファイリングにはオーバーヘッドがあることに注意してください)。ページに記載されているように、レベル 2 ですべてのクエリを表示できるようにする必要があります。

于 2012-08-30T18:19:13.387 に答える