Hvordan finne dokumenter av flere betingelser for ett felt med QueryBuilderAPI i Lære MongoDB?

stemmer
4

Jeg har en datamodell i MongoDB som jeg kan med hell spørre av innfødte MongoDB spørringer. Men jeg er ikke i stand til å uttrykke dem med spørreverktøyet API Lære MongoDB ODM.

Dette er hvordan min modell ser ut i MongoDB (dette er noen eksempel JSON-kode):

{ name: ArticleName, 
  features: {
    { type: color,
      ...
      values: {
        { value: RED, 
          label: red,
          ....
        },

        { value: GREEN, 
          label: green }
      } 
    },
    { type: width,
      values: {
        { value: 40}
      } 
    }
  }
}

Jeg ønsker å finne artikler ved å søke etter ulike funksjonsverdikombinasjoner , f.eks jeg ønsker å finne en artikkel med color = green og width = 40.

Men jeg var ikke i stand til å bygge en spørring for det med Lære MongoDB ODM spørreverktøyet API **? Dette er hva jeg prøvde:

# Document/ArticleRepository.php    

$features = array('color'=>'RED', 'width'=>'40');
$qb = $this->createQueryBuilder('CatalogBundle:Article'); // I use symfony 2
foreach ($features as $type => $value)
{
    $qb->field('features')->elemMatch(
        $qb->expr()->field('type')->equals($type)->field('values')->elemMatch(
            $qb->expr()->field('value')->equals($value)
        )
    );
}
return $qb->getQuery()->execute();

Men dette resulterer i en spørring, som inneholder bare én betingelse. Den andre betingelsen synes å bli overskrevet. Dette er spørsmålet som genereres av spørreverktøyet :

db.articles.find({ features: { $elemMatch: { type: width, values: { $elemMatch: { value: 40 } } } } })

Er det en måte å løse mitt bruk tilfelle med MongoDB ODM spørreverktøyet API?

Publisert på 17/04/2011 klokken 12:45
kilden bruker
På andre språk...                            


1 svar

stemmer
5

Jeg mellomtiden løste mitt problem ved å bruke $ all-operatør . Jeg bygger en rekke uttrykk som sendes til Lære MongoDB all()-metoden. Strategien med $elemMatchjeg prøvde ovenfor ville ikke engang har jobbet med MongoDB. Du må legge til -> getQuery () ved utgangen for å kunne skrive uttrykket til en matrise. For noen grunn uttrykk ennå ikke er dokumentert , men du kan sjekke deres funksjonalitet i kildekoden .

# Document/ArticleRepository.php

$features = array('color'=>'RED', 'width'=>'40');
$qb = $this->createQueryBuilder('CatalogBundle:Article');
$all_features[] = array();

foreach ($features as $templateID => $value)
{
    # Add expression as a subquery to array
    $all_features[] = $qb->expr()->elemMatch(
        $qb->expr()->field('templateID')->equals($templateID)->field('values')->elemMatch(
            $qb->expr()->field('value')->equals($value)
        )
    )->getQuery();
}
# Add expressions to query
$qb->field('features')->all($all_features);

Et uttrykk støtter stort sett alle metoder du kan bruke når du bygger en spørring. Du kan bygge din MongoDB forespørsel fra interlacing flere uttrykk. Dette tillater deg å bygge komplekse MongoDB spørringer du kan bygge ellers bare ved å sende en matrise til findBy()-metoden. Men med den nåværende versjonen (Beta 2) Lære ODM denne strategien vil ikke tillate deg å legge til flere metoder til MongoDB kjeden, som .limit().

Så uttrykk ser ut som den beste strategien for å bygge komplekse spørringer med Lære MongoDB.

Svarte 28/04/2011 kl. 01:19
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more