2 Stimmen

Mongoid regex für ein Element im Array

Ich habe zwei Modelle, einen Benutzer und ein eingebettetes Modell Nachricht

class User
  include Mongoid::Document
  embeds_many :messages
end

class Message
  include Mongoid::Document

  field :keywords, :type => Array
end

Ich versuche so etwas zu tun:

u = User.last
u.messages.where(:keywords => /sometext/).first

Aber das gibt nichts zurück, das Regex scheint gut zu funktionieren, wenn das Feld nicht vom Typ Array ist und ein String ist. Wie kann ich so etwas mit Mongoid machen?

Ich sollte auch erwähnen, dass diese Mongo-Abfrage gut funktioniert:

db.users.find({"messages.keywords" : /index/ })

0 Stimmen

Es sieht so aus, als ob du mongoid verwendest. Dies ist eine Wrapper um den MongoDB Ruby-Treiber und gibt seine eigenen Abfragen so aus, wie er es für angemessen hält. Hast du eine Möglichkeit zu überprüfen, welche Abfrage mongoid tatsächlich ausführt? Ist es die gleiche, die du ausgeführt hast?

0 Stimmen

Also ich glaube, dass dies tatsächlich ein Problem damit ist, wie Mongoid eingebettete Modelle behandelt, wenn ich die Messages-Modelle in ein referenziertes Modell ziehe, funktioniert diese Abfrage einwandfrei.

2voto

Alex Punkte 4187

Wenn Sie mit einem Array arbeiten, verwenden Sie "in".

 users = User.where("messages.keywords".in => [/sometext/])

sollte, wenn ich nicht irre, funktionieren.

Alex

User.where("messages.keywords".in => [/sometext/]).each do |user|
  message_collection_for_user = user.messages.where("keywords".in => [/sometext/])
end

Jetzt haben Sie Ihre Nachrichten und können tun, was immer Sie wollen, aber Sie können keine Sammlung von Nachrichten für alle Benutzer bekommen, es funktioniert nicht auf diese Weise.

0 Stimmen

Dies würde auch das Benutzermodell und nicht das Nachrichtenmodell zurückgeben.

0 Stimmen

Das ist korrekt, aber da Ihre Model-Nachricht innerhalb des Modells eingebettet ist, gibt es einfach keine Möglichkeit, die direkte Nachricht mit MongoDB zu erhalten, so funktionieren eingebettete Dokumente nicht... siehe Bearbeitung, um das zu erhalten.

0 Stimmen

Wenn Sie wirklich eine Sammlung von Nachrichten aller Benutzer möchten, sollten Sie die Nachrichten nicht innerhalb des Benutzers einbetten und stattdessen darauf verweisen.

1voto

Ryan McGeary Punkte 228632

Ihre direkte Mongo-Abfrage findet alle Benutzerdokumente, die eingebettete Nachrichten mit dem angegebenen übereinstimmenden Teilstring haben. Es sieht so aus, als ob die Absicht Ihrer Mongoid-Abfrage darin besteht, eine übereinstimmende Nachricht auf einem bereits zurückgegebenen Benutzerdokument zu finden. Ich bin mir nicht sicher, nach welchem Verhalten Sie suchen, aber wenn Sie dieselbe Mongo-Direktabfrage in Mongoid durchführen möchten, würde sie so aussehen:

users = Benutzer.where("messages.keywords" => /sometext/)

0 Stimmen

Das Problem dabei ist, dass ich den Nachrichten Datensatz zurückgegeben bekommen muss, nicht den Benutzer Datensatz.

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