2 Stimmen

Mongo Regex-Abfrage für Feld in Liste der eingebetteten Objekte

Ich habe eine Sammlung mit Datensätzen wie diesem

> db.company.findOne({companyId:1})
{
"_id" : ObjectId("4e22ff08eefdd839f60ab95f"),
"lastUpdate" : ISODate("2011-07-11T17:00:00Z"),
"errorCount" : 0,
"house" : 49,
"phones" : [
    {
        "cityCode" : "3852",
        "number" : "461423",
        "type" : "phone"
    },
    {
        "cityCode" : "3852",
        "number" : "461317",
        "type" : "phone"
    }
],
"houseAdd" : "",
"rubricsId" : [
    NumberLong(184108177),
    NumberLong(184108175)
],
"companyId" : NumberLong(1)
}

jetzt versuche ich alle Firmen zu finden, deren Telefonnummern mit 8-800 beginnen Ich versuche, meine Anfrage zu suchen

db.company.find({"phones.number":/8-800.*/}

und erhalten eine leere Liste. Aber

db.company.find({"phones.number":/8.*/})

alle Unternehmen zurückgeben, deren Telefonnummern mit acht beginnen. AFAIK ist '-' kein spezielles Zeichen für regex in diesem Zusammenhang? Ich habe regex '8\-800' mit dem gleichen Ergebnis versucht. Wo liege ich falsch?

2voto

mu is too short Punkte 411765

Vielleicht haben Sie einen komischen Unicode in Ihren Daten. Nur weil es wie ein Bindestrich aussieht, heißt das nicht, dass es ein Bindestrich ist. Sie könnten versuchen, den gesuchten Eintrag zu finden mit findOne und dann die Daten durch einen Hex-Dumper laufen lassen, um zu sehen, ob es sich wirklich um einen einfachen ASCII-Bindestrich handelt oder um ein Unicode-Ding, das wie ein Bindestrich aussieht. Wenn dies der Fall ist, dann lockern Sie Ihr Suchmuster auf etwas wie /^8\W+800/ und optimieren Sie es, bis es genau das findet, wonach Sie suchen.

Übrigens sind Sie nicht die erste Person, die sich mit trickreichem Unicode auseinandersetzt:

String ist nicht gleich sich selbst

1voto

Qtax Punkte 32095

Eine andere mögliche Lösung:

/^\D*8\D*800/
  • ^ Stellen Sie sicher, dass dies am Anfang der Zeichenkette steht.
  • \D* eine beliebige Anzahl von nicht dezimalen Zeichen, entspricht dem, was Sie zwischen 8 et 800 (außer Zahlen).

Die erste \D* ist möglicherweise nicht erforderlich, wenn Sie wissen, dass alle diese Zeichenfolgen mit Zahlen beginnen und nicht mit etwas anderem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X