it-swarm.com.de

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

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

So etwas wie:

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

Ist das möglich? 

317
johnny

Sie können dies mit dem folgenden Code tun.

db.users.findOne({"username" : {$regex : ".*son.*"}});
505

Da Mongo Shell Regex unterstützt, ist das absolut möglich.

db.users.findOne({"username" : /.*son.*/});

Wenn die Abfrage zwischen Groß- und Kleinschreibung unterscheiden soll, können Sie die Option "i" verwenden (siehe unten):

db.users.findOne({"username" : /.*son.*/i});

Siehe: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

148
James Gan

https://docs.mongodb.com/manual/reference/sql-comparison/

http://php.net/manual/de/mongo.sqltomongo.php

MySQL

SELECT * FROM users WHERE username LIKE "%Son%"

MongoDB

db.users.find({username:/Son/})
104
Zheng Kai

Ab Version 2.4 können Sie ein Textindex für die Felder erstellen, um nach dem $ text -Operator zu suchen und ihn zum Abfragen zu verwenden.

Erstellen Sie zuerst den Index:

db.users.createIndex( { "username": "text" } )

Dann suchen Sie:

db.users.find( { $text: { $search: "son" } } )

Benchmarks (ca. 150.000 Dokumente):

  • Regex (andere Antworten) => 5,6-6,9 Sekunden
  • Textsuche => .164-.201 Sekunden

Anmerkungen:

  • Eine Sammlung kann nur einen Textindex haben. Sie können einen Platzhaltertextindex verwenden, wenn Sie nach any Zeichenfolgenfeldern wie folgt suchen möchten: db.collection.createIndex( { "$**": "text" } ).
  • Ein Textindex kann groß sein. Es enthält einen Indexeintrag für jedes eindeutige nachgestammte Wort in jedem indizierten Feld für jedes eingefügte Dokument.
  • Das Erstellen eines Textindex dauert länger als bei einem normalen Index.
  • Ein Textindex speichert keine Ausdrücke oder Informationen über die Nähe von Wörtern in den Dokumenten. Infolgedessen werden Phrasenabfragen viel effektiver ausgeführt, wenn die gesamte Sammlung in den Arbeitsspeicher passt.
68
okoboko

Da dies einer der ersten Treffer in den Suchmaschinen ist und keiner der oben genannten Punkte für MongoDB 3.x zu funktionieren scheint, ist hier eine reguläre Ausdrücke-Suche, die funktioniert:

db.users.find( { 'name' : { '$regex' : yourvalue, '$options' : 'i' } } )

Keine Notwendigkeit, einen zusätzlichen Index oder ähnliches zu erstellen.

17
Nitai

Wenn Sie MongoDB über Python verbinden, müssen Sie Folgendes tun

db.users.find({"username": {'$regex' : '.*' + 'Son' + '.*'}})

sie können auch einen Variablennamen anstelle von 'Son' und damit die Verkettung der Zeichenfolge verwenden.

15
Patthebug

Einfachste Möglichkeit, diese Aufgabe zu erledigen 

Wenn Sie möchten, dass die Abfrage GroßKleinschreibung berücksichtigt wird - /

db.getCollection("users").find({'username':/Son/})

Wenn Sie möchten, dass die Abfrage GroßKleinschreibung nicht berücksichtigt wird - /

db.getCollection("users").find({'username':/Son/i})
11
Anurag Misra

ideale Antwort sein Verwendungsindex i Option für Groß-/Kleinschreibung nicht beachten

db.users.findOne({"username" : new RegExp(search_value, 'i') });
0
Hisham

So ignorieren Sie HTML-Tags in einem RegExp-Match:

var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="/wiki/Felidae" title="Felidae">cat</a> <a href="/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="/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="/wiki/Lion" title="Lion">lion</a>, <a href="/wiki/Leopard" title="Leopard">leopard</a>, <a href="/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="/wiki/Deer" title="Deer">deer</a> and <a href="/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 kann wahrscheinlich sehr einfach in einen MongoDB-Aggregationsfilter umgewandelt werden.

0
Tamás Polgár