2013-11-07 4 views
0

У меня есть две коллекции, categories и jobs, тем jobs коллекция ссылки внутри categories.Doctrine2 - Как запросить ссылочных документов в MongoDB

Теперь я имею в CategoryRepository метод, называемый getWithActiveJobs(), этот метод возвращает все категории с ссылочных работ, которые только не истекли и активированных.

Проблема в том, когда я запускаю этот метод, ничего не возвращается. Я новичок в MongoDB, поэтому, пожалуйста, скажите мне, как запросить jobs внутри CategoryRepository?

Вот мои коллекции (сеттера и добытчики и другие методы исключены):

Category.php:

namespace Ibw\JobeetBundle\Document; 

use Ibw\JobeetBundle\Utils\Jobeet; 

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
* @MongoDB\Document(collection="categories", repositoryClass="Ibw\JobeetBundle\Repository\CategoryRepository") 
*/ 
class Category 
{ 

    /** 
    * @MongoDB\Id(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @MongoDB\String 
    */ 
    protected $name; 

    /** 
    * @MongoDB\ReferenceMany(targetDocument="Job") 
    */ 
    protected $jobs = array(); 

    /** 
    * @MongoDB\ReferenceMany(targetDocument="Affiliate") 
    */ 
    protected $affiliates = array(); 

    /** 
    * @MongoDB\String 
    */ 
    protected $slug; 
} 

Job.php:

namespace Ibw\JobeetBundle\Document; 

use Ibw\JobeetBundle\Utils\Jobeet; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
* @MongoDB\Document(collection="jobs", repositoryClass="Ibw\JobeetBundle\Repository\JobRepository") 
* @Assert\GroupSequence({"Form", "Job"}) 
*/ 
class Job 
{ 
    /** 
    * @MongoDB\Id(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank(groups={"Form"}) 
     * @Assert\Choice(callback="getTypeValues", groups={"Form"}) 
    */ 
    protected $type; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank(groups={"Form"}) 
    */ 
    protected $company; 

    /** 
     * @MongoDB\String 
    */ 
    protected $logo; 

     /** 
     * @Assert\Image(groups={"Form"}) 
     */ 
     protected $file; 

    /** 
     * @MongoDB\String 
     * @Assert\Url(groups={"Form"}) 
    */ 
    protected $url; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank(groups={"Form"}) 
    */ 
    protected $position; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank(groups={"Form"}) 
    */ 
    protected $location; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank(groups={"Form"}) 
    */ 
    protected $description; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank(groups={"Form"}) 
    */ 
    protected $how_to_apply; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank() 
    */ 
    protected $token; 

    /** 
     * @MongoDB\Boolean 
    */ 
    protected $is_public; 

    /** 
     * @MongoDB\Boolean 
    */ 
    protected $is_activated; 

    /** 
     * @MongoDB\String 
     * @Assert\NotBlank(groups={"Form"}) 
     * @Assert\Email(groups={"Form"}) 
    */ 
    protected $email; 

    /** 
     * @MongoDB\Date 
    */ 
    protected $expires_at; 

    /** 
     * @MongoDB\Date 
    */ 
    protected $created_at; 

    /** 
     * @MongoDB\Date 
    */ 
    protected $updated_at; 

    /** 
     * @MongoDB\ReferenceOne(targetDocument="Category", cascade={"persist"}) 
     * @Assert\NotBlank(groups={"Form"}) 
    */ 
    protected $category; 
} 

И вот CategoryRepository.php метода:

public function getWithActiveJobs($limit = null) 
{ 
    $qb = $this->createQueryBuilder() 
       ->field('jobs')->prime(true) 
       ->field('jobs.expires_at')->gt(date('Y-m-d H:i:s', time())) 
       ->field('jobs.is_activated')->equals(true) 
       ->sort('jobs.expires_at', 'DESC'); 

    if($limit) 
    { 
     $qb->limit($limit); 
    } 

    return $qb->getQuery()->execute(); 
} 

Вот MongoDB categories коллекция:

> db.categories.find().pretty() 
{ 
    "_id" : ObjectId("527b884610fedf400d8b4589"), 
    "name" : "Design", 
    "slug" : "design" 
} 
{ 
    "_id" : ObjectId("527b884610fedf400d8b458c"), 
    "name" : "Administrator", 
    "slug" : "administrator" 
} 
{ 
    "_id" : ObjectId("527b884610fedf400d8b458a"), 
    "jobs" : [ 
     DBRef("jobs", ObjectId("527b884610fedf400d8b4587")) 
    ], 
    "name" : "Programming", 
    "slug" : "programming" 
} 
{ 
    "_id" : ObjectId("527b884610fedf400d8b458b"), 
    "jobs" : [ 
     DBRef("jobs", ObjectId("527b884610fedf400d8b4588")) 
    ], 
    "name" : "Manager", 
    "slug" : "manager" 
} 

ответ

0

Это общая ошибка при запуске с MongoDB:

вы не можете сделать JOIN

Премьер-атрибут будет получать рабочие места документов, но только после того, как запрос был выполнен, и не поможет.

Вы можете попробовать другой подход:

Используйте отчетливый запрос и извлечь все категории IDS активных рабочих мест:

db.Job.distinct('category.$id', { is_activated: true }) 
Смежные вопросы