我有一个包含这样的对象的集合:
{
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
}
答案 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在数据库中的期望相同。