2012-10-21 16 views
33

Dies muss viel gefragt werden, aber es ist sehr schlecht dokumentiert. Es gibt keine Erwähnung bei http://mongoid.org/en/mongoid/docs/querying.htmlMongoid ODER Abfrage Syntax

Ich versuche, zu prüfen, ob ein Benutzer vorhanden ist (unten ist eine AND-Abfrage), wie kann ich es auf eine OR Typ Abfrage

Username.where(:username=>@username, :email=>@email) 

(entweder die E-Mail ändern oder der Benutzername muss übereinstimmen). http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

Sicherlich muss es sein, eine einfache klare Syntax, dies zu tun richtig:

Ich habe einige ziemlich komplizierte Weise Online einschließlich das Senden einer direkten Javascript (von) gefunden?

Antwort

35

Ja, das wurde früher besser dokumentiert. Versuchen Sie folgendes:

Username.any_of({:username => @username}, 
       {:email => @email}) 
101

Im Interesse der anderen, die auf dieser Seite landen, die aktualisierte Syntax jetzt

Username.or({username: @username}, {email: @email}) 

ist verweisen auf die updated docs.

+10

behalten In den Bereichen müssen Sie noch 'any_of' verwenden, sonst wird es einen Syntaxfehler werfen. – aledalgrande

+1

Der angegebene Link sagt nichts über '.or' oder' any_of', bitte [hier] (https://github.com/mongodb/mongoid/blob/master/lib/mongoid/criteria/queryable/selectable. rb) um detaillierte Dokumentation und Implementierung zu sehen – silva96

+0

Sie können auch self.or in Bereichen verwenden (weil 'or' ist ein Schlüsselwort in Ruby) – Shiyason

1

In Mongoid 5.0 funktioniert dies für mich

Username.or({username: @username}.or({email: @email}) 
2

Es ist ein Tippfehler in @ miguel-savignano Antwort. Laut Stackoverflow ist die "Editierwarteschlange voll", weshalb ich keine Bearbeitung eingereicht habe.

richtige Syntax:

Username.or({username: @username}).or({email: @email}) 

Eine knappe Lösung:

Username.or({username: @username}, {email: @email}) 

Der Wähler Mongo wird lösen zu:

{"$or"=>[{"username"=>@username}, {"email"=>@email}]} 

ich diese Frage gefunden, wie ich war versuchen zu lösen für die Erstellung " oder "Abfragen.

Wenn Sie nach einem String oder einem Array aus Elementen suchen, müssen Sie eine Mongoid-Abfrage mit dem Mongo-Selektor '$ in' schreiben.

Zum Beispiel haben Sie einen bestimmten Benutzernamen und ein Array von E-Mails. Sie möchten alle Ergebnisse zurückgeben, bei denen mindestens eines der Felder mit dem Benutzernamen oder einer der E-Mails innerhalb des Arrays übereinstimmt.

@username = "jess" 
@emails = ["[email protected]", "[email protected]", "[email protected]"] 
User.or({username: ""}, {email: {'$in': @emails}}) 

Der Wähler Mongo wird lösen zu:

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]} 
  • Wenn Sie Users mit 2 der 3 E-Mails in Ihrer Datenbank haben, dann wird der Wähler
  • eine Zählung von 2. Rückkehr Wenn Sie eine User mit der username "jess" und 3 zusätzliche Users jeweils mit einer der angegebenen E-Mails haben, dann wird der Selektor eine Anzahl von 4 zurückgeben.
3

Auch in Mongoid 5.0, wenn Sie immer noch die where Methode verwenden möchten, verwenden Sie die folgende

Username.where('$or' => [ { username: @username }, { email: @email } ]) 

dies ist sehr nützlich, wenn Sie eine Art von Abfrage-Hash in einer dynamischen Art und Weise den Aufbau und Sie müssen die where Methode