742 Stimmen

Prüfen, ob ein Feld eine Zeichenkette enthält

Ich suche einen Operator, mit dem ich prüfen kann, ob der Wert eines Feldes eine bestimmte Zeichenfolge enthält.

Etwa so:

db.users.findOne({$contains:{"username":"son"}})

Ist das möglich?

9voto

bello hargbola Punkte 387

Wenn Sie die Suche nach mehr als einem Attribut durchführen müssen, können Sie $or verwenden. Zum Beispiel

Symbol.find(
  {
    $or: [
      { 'symbol': { '$regex': input, '$options': 'i' } },
      { 'name': { '$regex': input, '$options': 'i' } }
    ]
  }
).then((data) => {
  console.log(data)
}).catch((err) => {
  console.log(err)
})

Hier suchen Sie danach, ob die Eingabe im Attribut symbol oder im Attribut name enthalten ist.

8voto

KushalSeth Punkte 1772

Wenn der Regex in Ihrer Aggregatlösung nicht funktioniert und Sie verschachtelte Objekte haben. Versuchen Sie dies Aggregationspipeline (Wenn Ihre Objektstruktur einfach ist, entfernen Sie einfach die anderen Bedingungen aus der folgenden Abfrage):

db.user.aggregate({$match: 
     {$and:[
   {"UserObject.Personal.Status":"ACTV"},
   {"UserObject.Personal.Address.Home.Type":"HME"},
   {"UserObject.Personal.Address.Home.Value": /.*son.*/ }
   ]}}
   ) 

Eine andere Möglichkeit wäre eine direkte Abfrage wie diese:

db.user.findOne({"UserObject.Personal.Address.Home.Value": /.*son.*/ });

6voto

Scott Wager Punkte 492

Wenn Ihre Regex eine Variable enthält, stellen Sie sicher, dass Sie Flucht es.

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

Dies kann wie folgt verwendet werden

new RegExp(escapeRegExp(searchString), 'i')

Oder in einer MongoDb-Abfrage wie dieser

{ '$regex': escapeRegExp(searchString) }

Gleicher Kommentar veröffentlicht aquí

6voto

F.H. Punkte 1227

Für den Aggregationsrahmen


Feldsuche

( '$options': 'i' für die Suche ohne Berücksichtigung der Groß- und Kleinschreibung)

db.users.aggregate([
    {
        $match: {
            'email': { '$regex': '@gmail.com', '$options': 'i' }
        }
    }
]);

Vollständige Dokumentensuche

(funktioniert nur bei Feldern, die mit einem Textindex

db.articles.aggregate([
    {
        $match: { $text: { $search: 'brave new world' } }
    }
])

2voto

Tamás Polgár Punkte 1992

Wie man HTML-Tags in einer RegExp-Übereinstimmung ignoriert:

var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="http://stackoverflow.com/wiki/Felidae" title="Felidae">cat</a> <a href="http://stackoverflow.com/wiki/Species" title="Species">species</a>, most recognizable for its pattern of dark vertical stripes on reddish-orange fur with a lighter underside. The species is classified in the genus <i><a href="http://stackoverflow.com/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="http://stackoverflow.com/wiki/Lion" title="Lion">lion</a>, <a href="http://stackoverflow.com/wiki/Leopard" title="Leopard">leopard</a>, <a href="http://stackoverflow.com/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="http://stackoverflow.com/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="http://stackoverflow.com/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="http://stackoverflow.com/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="http://stackoverflow.com/wiki/Deer" title="Deer">deer</a> and <a href="http://stackoverflow.com/wiki/Bovid" class="mw-redirect" title="Bovid">bovids</a>.</p>';
var searchString = 'largest cat species';

var rx = '';
searchString.split(' ').forEach(e => {
  rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)';
});

rx = new RegExp(rx, 'igm');

console.log(text.match(rx));

Dies lässt sich wahrscheinlich sehr leicht in einen MongoDB-Aggregationsfilter umwandeln.

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