2011-09-10 5 views
2

j'ai deux classesMongoId: retour des valeurs distinctes pour les objets embedded_in qui correspondent à une des options

class Claim 
    include Mongoid::Document 
    embeds_many :claim_fields 
    belongs_to :user 
    ... 
end 

class ClaimField 
    include Mongoid::Document 
    embedded_in :claim 
    field :title 
    field :value 
    ... 
end 

je dois chercher toutes les valeurs uniques pour claim_fields avec le titre actuel de ma réclamation par db (par Ruby - il est trop lent pour des milliers d'enregistrements)

Je l'ai déjà tryied ce

user = User.find(...) 
Claim.collection.distinct("claim_fields.value", {:user_id => user.id, "claim_fields.title" => some_title}) 
# that is the same as user.claims.find(...).distinct("claim_fields.value") 

Mais elle retourne toutes les valeurs de claim_fields, et je besoin de retourner les valeurs seulement pour claim_fiel DS avec le titre dont j'ai besoin.

PS semble que j'ai besoin MapReduce ici

Répondre

3

Le problème fondamental est que les requêtes MongoDB ne renvoient que des documents entiers. Vous filtrez claim_fields.title, mais le système renvoie tous les documents Claim qui correspondent.

Vous faites un distinct, mais MongoDB traite différemment les sous-objets et les documents. En conséquence, le distinct ne fait probablement pas ce que vous voulez.

Il y a deux solutions possibles ici:

  1. précalculer par M/R. (comme vous le suggérez)
  2. Divisez-les en deux collections.

En ce qui concerne le point 2, il n'est pas nécessaire d'incorporer des objets comme vous l'avez fait. Embedded devrait être fait en fonction des requêtes que vous prévoyez d'effectuer le plus. Donc, s'il s'agit d'une requête courante, il est juste de faire ces documents distincts.

+0

Le problème est qu'au début il n'y avait aucun besoin d'interroger à travers les objets embarqués, mais maintenant nous en avons besoin – fl00r

Questions connexes