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?

1138voto

Parvin Gasimzade Punkte 23145

Sie können dies mit folgendem Code tun.

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

268voto

James Gan Punkte 6408

Da die Mongo-Shell Regex unterstützt, ist das durchaus möglich.

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

Wenn die Groß- und Kleinschreibung bei der Abfrage nicht beachtet werden soll, kann die Option "i" verwendet werden, wie unten gezeigt:

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

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

226voto

Zheng Kai Punkte 3311

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

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

MySQL

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

MongoDB

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

109voto

okoboko Punkte 4272

Ab der Version 2.4 können Sie eine Textindex auf das/die zu durchsuchende(n) Feld(er) und verwenden Sie die $Text Operator für die Abfrage.

Erstellen Sie zunächst den Index:

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

Dann, um zu suchen:

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

Benchmarks (~150K 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 Wildcard-Textindex verwenden, wenn Sie suchen möchten cualquier String-Feld, etwa so: db.collection.createIndex( { "$**": "text" } ) .
  • Ein Textindex kann sehr umfangreich sein. Er enthält einen Indexeintrag für jedes eindeutige Wort nach dem Wortstamm in jedem indizierten Feld für jedes eingefügte Dokument.
  • Der Aufbau eines Textindexes dauert länger als der eines normalen Indexes.
  • Ein Textindex speichert keine Phrasen oder Informationen über die Nähe der Wörter in den Dokumenten. Daher werden Phrasenabfragen viel effektiver ausgeführt, wenn die gesamte Sammlung in den Arbeitsspeicher passt.

60voto

Nitai Punkte 1641

Da dies einer der ersten Treffer in den Suchmaschinen ist und keine der oben genannten Methoden für MongoDB 3.x zu funktionieren scheint, hier eine Regex-Suche, die funktioniert:

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

Es ist nicht nötig, einen zusätzlichen Index oder ähnliches zu erstellen.

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