2013-04-15 17 views
8

Ich versuche, eine Abfrage von dem, was der Benutzer gesucht hat, zu erzeugen. Ich habe ein Array von Strings, die ich gerade in der mongoDB Wähler senden durch wollen, mein Problem ist, mit dem/Text/Syntax, es funktioniert perfekt von der mongoDB Konsole wie folgt aus:Meteor & mongoDB LIKE Abfrage

Items.find({ $or: [{name: /doc/}, {tags: /doc/}, {name: /test/}, {tags: /test/}] }); 

Aber ich kann nicht verwalten schreibe die gleiche Syntax in Javascript, ich habe mehrere Versionen ausprobiert.

Aber es sucht nur nach "Text" und nicht was in der Variable ist. Und so:

Aber das gibt mir keine Ergebnisse zurück. Was vermisse ich?

+0

Verwenden Sie mongodb auf dem Server oder minimongo auf dem Client? (oder beides?) – mquandalle

+0

Gerade jetzt, beides. Ich versuche nur eine App mit Meteor Standardeinstellungen. – Snidd

Antwort

18

Sie haben Ihre regulären Ausdrücke mit Javascript bauen:

var mongoDbArr = []; 
searchArray.forEach(function(text) { 
    mongoDbArr.push({name: new RegExp(text)}); 
    mongoDbArr.push({tags: new RegExp(text,"i")}); 
}); 

return Items.find({ $or: mongoDbArr}); 

Oder eine regular expressions Abfrage mit mongodb verwenden:

mongoDbArr.push({name: { $regex : text, $options:"i" } }); 
mongoDbArr.push({tags: { $regex : text, $options:"i" } }); 

Um Sonderzeichen zu vermeiden, können Sie dies tun, bevor Sieverwenden(aus der Quelle von JQuery UI)

text = text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); 
+0

Regulärer Ausdruck funktionierte für jetzt, ich bin besorgt, was passiert, wenn der Benutzer reservierte Zeichen eingibt, was verschiedene Dinge in Regex bedeutet. – Snidd

+0

Ive modifizierte die Antwort, um Sonderzeichen zu entkommen. – Akshat

+0

Whoa. Funktionieren beide Regex-Abfragen auf der Clientseite? Beeindruckend. Ja tut es. Verblüfft. Putting dies in meinem neuen [Meteor Autokomplettierung] (https://github.com/mizzao/meteor-autocomplete) Paket ... –

5

Versuchen Sie dies in der veröffentlichen Funktion im Server:

return YourCollection.find({'$or' : [ 
    { 'field1':{'$regex':searchString} }, 
    { 'field2':{'$regex':searchString} }, 
    { 'field3':{'$regex':searchString} }, ] 
}); 
+0

Dieser arbeitete für mich. Vielen Dank! –