Mongodb Subdocument Диапазон дат возвращает неверные результаты
Впервые в Stackru. Я пытаюсь выполнить запрос диапазона дат для коллекции массивов, но Mongo Shell возвращает ненужные документы, которые не соответствуют моим критериям. Не имеет значения, что я делаю запрос через драйверы PHP, Doctrine Mongodb Query-builder или Mongo Shell.
Вот мой запрос:
db.deals.find( { "total_sold.created_at":
{ $gt: new ISODate("2014-03-05T00:00:00Z"),
$lt: new ISODate("2014-03-05T23:59:00Z")
}
}).limit(1).pretty()
И вот результат:
{
"_id" : "1241412fb99a11a0bc70032a2cb6059b",
"total_sold" : [
{
"some_field": "value",
"created_at" : ISODate("2014-02-13T15:48:35Z"),
},
{
"some_field": "value",
"created_at" : ISODate("2014-02-14T10:26:19Z"),
},
{
"some_field": "value",
"created_at" : ISODate("2014-02-15T11:36:50Z"),
},
{
"some_field": "value",
"created_at" : ISODate("2014-02-17T09:35:19Z"),
},
{
"some_field": "value",
"created_at" : ISODate("2014-02-19T16:34:52Z"),
},
{
"some_field": "value",
"created_at" : ISODate("2014-02-21T12:06:10Z"),
},
{
"some_field": "value",
"created_at" : ISODate("2014-02-24T09:52:23Z"),
},
{
"some_field": "value",
"created_at" : ISODate("2014-03-07T22:40:37Z"),
}
],
"updated_at" : ISODate("2014-03-07T22:40:40Z")
}
Я пытаюсь запросить документы с полями "total_sold.created_at", установленными в "2014-03-05", но возвращаемый результат не включает в себя какие-либо подколлекции, созданные в "2014-03-05", в чем смысл? Я пропал? Я пробовал операторы $ и $, запись $ total_sold.created_at и т. Д., Но безрезультатно.
Ps: поле total_sold.created_at проиндексировано.
Изменить: я создал и сохранил свои документы с помощью Doctrine-Mongodb. Вот мои доктрина-монгодбские отображения. Для основного документа и вложенного документа total_sold.
<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ODM\Document(
* collection="deals",
* )
* @ODM\Index(keys={"total_sold"="desc"}),
*/
Class Deal {
/**
* @ODM\Id(strategy="NONE")
*/
protected $id;
/**
*Some other fields
**/
/**
* @ODM\EmbedMany(targetDocument="DealTotalSold")
*/
protected $total_sold;
/**
* Constructor
*/
public function __construct() {
$this->total_sold = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add totalSold
*
*/
public function addTotalSold($totalSold) {
$this->total_sold[] = $totalSold;
}
/**
* Remove totalSold
*
*/
public function removeTotalSold($totalSold) {
$this->total_sold->removeElement($totalSold);
}
/**
* Get totalSold
*
* @return Doctrine\Common\Collections\Collection $totalSold
*/
public function getTotalSold() {
return $this->total_sold;
}
}
И это мой поддокумент.
<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ODM\EmbeddedDocument
*/
Class DealTotalSold {
/**
* @ODM\Id(strategy="NONE")
*/
protected $id;
/**
* @ODM\Date
* @Gedmo\Timestampable(on="create")
*/
protected $created_at;
/**
* @ODM\Int
*/
protected $delta_totalsold;
public function __construct()
{
}
/**
* Set createdAt
*
* @param date $createdAt
* @return self
*/
public function setCreatedAt($createdAt)
{
$this->created_at = $createdAt;
return $this;
}
/**
* Get createdAt
*
* @return date $createdAt
*/
public function getCreatedAt()
{
return $this->created_at;
}
/**
* Set dealtaTotalsold
*
* @param Int $dealtaTotalsold
* @return self
*/
public function setDeltaTotalsold($dealtaTotalsold)
{
$this->delta_totalsold = $dealtaTotalsold;
return $this;
}
/**
* Set id
*
* @param custom_id $id
* @return self
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* Get id
*
* @return custom_id $id
*/
public function getId()
{
return $this->id;
}
/**
* Get deltaTotalsold
*
* @return float $deltaTotalsold
*/
public function getDeltaTotalsold()
{
return $this->delta_totalsold;
}
}
1 ответ
Вы должны использовать оператор $elemMatch для сопоставления более чем одного компонента в элементе массива с $ и
db.deals.find({ total_sold: { $elemMatch : {
$and:[ {created_at: {$gt: new ISODate("2014-03-05T00:00:00Z") }},
{ created_at: {$lt: new ISODate("2014-03-05T23:00:00Z") }}
]
}}
});
$elemMatch Doc: http://docs.mongodb.org/manual/reference/operator/query/elemMatch/