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.
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).