如何查询嵌入对象中数组中的值?

时间:2011-12-23 14:36:49

标签: mongodb doctrine

我有一个包含这样的对象的集合:

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

所以基本上我有一个包含对象的集合,每个对象都有一个嵌入的(EmbedOne)文档Queue。 此Queue文档还包含@EmbedManyJob嵌入文档的集合。

我想查询包含已完成作业的文档:

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 :(得分:0)

使用以下代码(2.0.2)在shell上运行。

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")
         }
         ] 
    }
}

队列应该是哈希,因为它具有“作业”键。您的日期看起来没有正确存储。确保文档看起来与您通过shell在数据库中的期望相同。