Как запросить значение в массиве во встроенном объекте? - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть коллекция с объектами, подобными этим:

{
id => ...
[queue] => Array
    (
        [jobs] => Array
            (
                [0] => Array
                    (
                        [_id] => 308
                        [completedDate] => 1324649528
                    )
            )
                [1] => Array
                    (
                        [_id] => 308
                        [completedDate] => 1324649512
                    )
            )
    )
}

Так что в основном у меня есть коллекция с объектами с каждым вложенным (EmbedOne) документом Queue.Этот Queue документ также содержит коллекцию (@EmbedMany) Job вложенных документов.

Я хочу запросить документ с завершенным заданием:

db.Page.find({"queue.jobs.completedDate": { $ne : null} }).limit(10);

Я делаюэтот запрос с Doctrine2 ODM (1.0.0beta3)

$query = $this->dm->createQueryBuilder( $modelClass );
$query->field('queue.jobs')->elemMatch( $query->expr()->field('completedDate')->notEqual(null) );
//Or, its the same: $query->field('queue.jobs.completedDate')->notEqual(null);

$query->skip( $page*$perPage )->limit( $perPage );
return $query->getQuery()->execute();

но он ничего не возвращает, я что-то упустил?

Редактировать: это документ очереди:

/** 
* @EmbeddedDocument 
*/
class Queue {

/** @Boolean */
private $locked = false;

/** @Timestamp */
private $lockedAt;

/** @EmbedMany(targetDocument="Cron\Model\Document\Job") */
private $jobs = array();

    //...setters & getters
}

1 Ответ

0 голосов
/ 23 декабря 2011

Работает здесь на оболочке с кодом ниже (2.0.2).

db.Page.insert({
"queue": {
        "jobs": [
        {
            "_id": ObjectId(),
            "completedDate": ISODate()
        },
        {
            "_id": ObjectId(),
            "completedDate": ISODate()
        }
    ]}
})

db.Page.find ({"queue.jobs.completedDate": {$ ne: null}}). Limit (10);

{ "_id" : ObjectId("4ef49ebe093f0426a41ec640"),
    "queue" : {
        "jobs" : [ 
         { 
            "_id" : ObjectId("4ef49ebe093f0426a41ec63e"),
            "completedDate" : ISODate("2011-12-23T15:31:10.881Z")
         }, 
         {
            "_id" : ObjectId("4ef49ebe093f0426a41ec63f"),
            "completedDate" : ISODate("2011-12-23T15:31:10.881Z")
         }
         ] 
    }
}

Очередь должна быть хэшем, поскольку она имеет ключ "jobs". Ваши даты выглядят так, как будто они хранятся неправильно. Убедитесь, что документы выглядят так, как вы ожидаете в базе данных через оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...