С PHP, как получить элементы, соответствующие созданному месяцу и году

Я использую этот код для получения новостей из моей MongoDB:

foreach (коллекция("новости")->найти(["создано"=>$время]) как $новости)

Теперь я хотел бы найти только те новостные статьи с «созданной» временной меткой unix, которая соответствует определенному месяцу определенного года, например, апрелю 2014 года.

Любая помощь будет оценена по достоинству.

Ваше здоровье.

РЕДАКТИРОВАТЬ: Спасибо всем за ваши усилия, и да, это временная метка unix.


person WebShaped.Biz    schedule 02.04.2014    source источник
comment
Это временная метка unix или дата BSON?   -  person Sammaye    schedule 02.04.2014


Ответы (3)


Как вы создали Unix Timestamp? Как это отражено в документе? Вы используете тип MongoDate или integer?

Если вы используете тип MongoDate, вам нужно создать объекты MongoDate и использовать их для условий $gte и $lt.

$article = array(
    "title"     => "My first article",
    "content"   => "This is good news",
    "published" => new MongoDate(),
    "author"    => "Random guy on the internet",
);

$collection->insert($article);

$start = new MongoDate(strtotime("yesterday"));
$end   = new MongoDate(strtotime("tomorrow"));

$cursor = $collection->find(array("ts" => array('$gt' => $start, '$lte' => $end)));

foreach($cursor as $article) {
    var_dump($article);
}

См. http://www.php.net/manual/en/class.mongodate.php для получения дополнительной информации

person bjori    schedule 10.04.2014

вам нужно будет создать свой собственный запрос:

SELECT * FROM news WHERE created >= $start_date AND created <= $end_date

где:

предполагая, что создана временная метка unix, в противном случае вам следует пропустить функцию strtotime

// first day of april 2014
$start_date = strtotime(date('2014-04-01'));

// last day of april 2014
$end_date = strtotime(date('2014-04-t'));
person ponciste    schedule 02.04.2014

Вы можете использовать DateTime::createFromFormat для создания меток времени.

$begin = DateTime::createFromFormat('!Y-m', '2014-04');
$end = clone $begin;
$end->modify('next month');

echo $begin->format('Y-m-d H:i:s'). PHP_EOL; // 2014-04-01 00:00:00
echo $end->format('Y-m-d H:i:s');            // 2014-05-01 00:00:00

И создайте более сложное условие.

collection("news")
    ->find(["created" => array(
        '$gte' => $begin->getTimestamp(), 
        '$lt' => $end->getTimestamp())]);
person sectus    schedule 02.04.2014
comment
Спасибо сектус. Это работает, это означает, что find() берет только $gte и отображает элементы, созданные после определенной даты. $lt и/или array() полностью игнорируются. И $begin, и $end определены правильно. - person WebShaped.Biz; 03.04.2014