2012-05-10 34 views
6

Come si controlla se esiste un documento incorporato per un documento che utilizza mongoid in Ruby on Rails? Dire che ho un documento che ha username, email, e potrebbe avere un documento incorporato nicknames. In questo momento se corro user.first.nicknames e se questo user non hai il documento incorporato nicknames in esso, sarà errore fuori. Ho provato matches? e exists? ma non funzionano.Come si controlla se un documento incorporato esiste in un documento in mongoi?

Grazie!

risposta

3

Questo dovrebbe restituire true se non esiste User.first.nicknames.nil? e questo restituisce true se esiste: User.first.nicknames.present?

+0

Questi entrambi non funzionano su un documento mongoDB che non ha 'nickname'. Produce un errore "NoMethodError: metodo non definito' nicknames' ". Questo funziona per i documenti che hanno 'nickname '.. – Goalie

+0

Non è quello che fa il mio, sto usando MongoId 2.3.3. Mi sembra che "User.first" sia in realtà nulla. Quindi stai cercando di chiamare 'nickname 'su un oggetto nullo. Puoi verificarlo? – ctcherry

0

dovrebbe essere semplice come {"user":{"$exists":"nicknames"}}

+0

È un comando mongo shell? Sto cercando una soluzione in Ruby on Rails. – Goalie

2

Si può fare User.where(:nicknames.exists => true).include?(user).

User.where(:nicknames.exists => true) restituirà solo i documenti che contengono nicknames.

8

Con un piccolo aiuto da altre risposte qui, ho trovato qualcosa che ha funzionato per me e credo che questo è ciò che il manifesto originale aveva in mente;

Model.where(:"subdoc.some_attribute".exists => true) 

Ciò restituirà tutti i documenti in cui è presente il "some_attribute" sul documento secondario. Notate la sintassi del simbolo, questo è quello che mi mancava.

+0

È anche possibile passare attraverso l'associazione: 'Model.subdocs.where (: field.exists => true)'. –

+0

Questo è quello che stavo cercando per tutto il giorno. Non è documentato da nessuna parte !? – fre2ak

Problemi correlati