3

以下は私を大いに混乱させます。オブジェクトとして渡された正規表現で 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()に逐語的に渡すにはどうすればよいですか? 私はそれを研究し、多くの潜在的な解決策を見つけましたが、残念ながら私にはうまくいきません。

前もって感謝します!

4

1 に答える 1