以下は私を大いに混乱させます。オブジェクトとして渡された正規表現で collection.find() が機能しない理由を理解しようと、かなりの時間を費やしてきました。正規表現の一致は、POST 要求の本文にラップされた HTTP 経由で行われます。次に、クエリを (文字列形式で) 収集し、クエリを実行しようとします。問題は、正規表現がノード内で引用符なしで記述されていない限り、機能しないことです。つまり、引用符なしのリテラルでなければなりません。
たとえば、次のようにするとうまくいきます。
var query1 = {
company: {
'$regex': /goog/
}
};
collection.find(query1, {}).toArray(function (err, docs) {
// Got results back. Awesome.
});
ただし、データがオブジェクトにラップされている場合、何も返されません。値が舞台裏で引用されているためだと思います(つまり、「/ goog /」):
// Assume
var query2 = {
company: {
'$regex': query.company
}
};
collection.find(query2, {}).toArray(function (err, docs) {
// Got nothing back.
});
mongo シェルでテストしたところ、次のことが確認できました。
// Returns 5 results
db.getCollection("contacts").find( { "company": /goog/ } )
// Doesn't match anything
db.getCollection("contacts").find( { "company": "/goog/" } )
さらに、次のことを発見しました。値を引用符で書くと
// Works fine
var companyRegex = {'$regex': /goog/};
var query3 = {
company: companyRegex
};
したがって、技術的には、オブジェクトにラップされた引用符のない「リテラル」正規表現は正常に機能します。ただし、文字列の場合は機能しません。二重引用符と単一引用符を何も置き換えようとした後でも (つまり、本質的にそれらを削除します)。
正規表現の一致をfind()に逐語的に渡すにはどうすればよいですか? 私はそれを研究し、多くの潜在的な解決策を見つけましたが、残念ながら私にはうまくいきません。
前もって感謝します!