Mongoid Portée Vérifier Si Le Tableau Champ Contient La Valeur

la solution pour cette question peut sembler assez simple, mais j'ai été onduler autour sans réponse.

j'utilise Mongoïde dans mon Rails 4.1.4 app. J'ai un modèle qui contient un Array champ qui hébergera Chaîne valeurs.

j'ai besoin d'un Mongoidportée dans le model pour récupérer les instances où cela Array contient un champ spécifique Chaîne valeur, donnée comme paramètre au scope. Disons que nous avons ce modèle:

class SomeModel
  include Mongoid::Document
  include Mongoid::Timestamps

  field :some_array, type: Array, default: Array.new

  scope :some_scope, ->(value){ elem_match(some_array: value) }

end

portée ne fonctionne pas parce que, évidemment, dans le MongoDB $elemMatch doit recevoir un Critères d'valeur. Mais, comment serait le Critères d' juste dire que l'élément doit être égal à la valeur donnée???.

n'importe quels indices sur la façon d'écrire ce assez simple portée???.

salutations!!!. Merci à l'avance.

18
demandé sur mu is too short 2014-10-10 20:13:24

1 réponses

vous êtes drastically overcomplicated things. Si un champ contient un tableau, vous pouvez le rechercher comme s'il ne s'agissait pas d'un tableau. Par exemple, si vous avez ceci dans un document:

{ some_array: [ 'where', 'is', 'pancakes', 'house?' ] }

et vous faites une requête comme ceci:

where(:some_array => 'pancakes')

vous trouverez ce document. Vous n'avez pas besoin $elemMatch ou rien de compliqué ici, vous pouvez prétendre que le tableau est une valeur unique pour les requêtes simples, comme vous avez:

scope :some_scope, ->(value) { where(:some_array => value) }

Vous avez seulement besoin d'entrer dans les $elemMatch si vous voulez appliquer des conditions multiples à chaque élément du tableau, des choses comme ça à partir de $elemMatch docs:

   results: { $elemMatch: { $gte: 80, $lt: 85 } }
// ^^^^^^^array           ^^^^^^^^^^^^^^^^^^^^^multiple conditions

ne vous sentez pas mal, les docs MongoDB actuels ne sont pas exactement clairs sur ce genre de choses (ou du moins je ne peux pas trouver une explication explicite).

27
répondu mu is too short 2014-11-28 18:49:17