С PHP, как да извлечете елементи, които съответстват на създадения месец и година

Използвам този код за извличане на новини от моя MongoDB:

foreach (collection("news")->find(["created"=>$time]) като $news)

Сега бих искал да намеря само онези новинарски статии със „създадено“ времево клеймо на 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