質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • PHP

    25496questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MongoDB

    295questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

phpでmongodbの値からソートして最新を取得する方法

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,673
phpでmongoDBにあるデータから

日付・時刻の降順でソートをかけて
条件に一致するデータのうち
最新のデータを取得したいのですが

その記述方法がよくわかりません。

下記の方法では出来ないのですが、
sql文では
select * from logdata WHERE key='$key' ORDER BY lastdate DESC,lasttime DESC
を実行し、その最初の行を取得したいのですが、

サイトのいろんなサンプルを見ても、ちょっとよくわかりませんでした。
insert はできたのですが

条件に一致するデータの更新(update)も記述がよくわかりませんでした。
ご指導ください

<?php

    //接続
        //Mongo
        $mongo = new Mongo();
        //データベース
        $db = $mongo->selectDB("sampledb");
        //コレクション
        $collection = $db->selectCollection("logdata");


    $key = "1234567";

    $doc = array( "key" => "$key" );


    $res = $collection->findOne( $doc );

    $doc2 = array("lastdate">="-1","lasttime">="-1");

    $res2 = $collection->sort($doc2);

    print "res<br>\n";
    var_dump ($res);


    print "res2<br>\n";
    var_dump ($res2);


?>

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • orange0190

    2015/05/21 11:52

    $doc2 = array("lastdate">="-1","lasttime">="-1"); はタイプミス?

    キャンセル

  • it_solution_lab

    2015/05/21 12:09

    日付と時間で、新しい順に並べる、というつもりの記述です
    どのように条件を指定すればよいのかわからないため、
    とりあえず指定してみましたが、これではNGなのは結果からわかっています。

    キャンセル

回答 2

0

このサイトがわかりやすいんじゃないかなと思います。
PHPでMongoDBを使ってみる

---------------------------------------------------------------------------------------
追記
    //接続 
        //Mongo 
        $mongo = new Mongo(); 
        //データベース 
        $db = $mongo->selectDB("sampledb"); 
        //コレクション 
        $collection = $db->selectCollection("logdata"); 


    $key = "1234567"; 

    $doc = array( "key" => $key ); 

    $res = $collection->find( $doc ); 

    $doc2 = array("lastdate"=>-1,"lasttime"=>-1); 
    
    $res->sort($doc2);
    $res->limit(1);

    foreach($res as $id => $res2){
        print "res2<br>\n"; 
        var_dump ($res2);
    }
以上でどうでしょうか?
実は詳しくないので、調べながら考えてみました。
未検証ですので、注意してください。



投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/21 12:10

    こちらのサイトを参照した結果、
    上記の記述をしたのですが、
    検索条件と、並べ替え条件を指定して、値を取得する、という記述が
    書かれていないため、よくわからない、というのが現状です

    キャンセル

0

順番や変数名を入れ替えたりコメント入れたりしたソース
データの更新は'$set'や'$inc'など修正子をキーにして指定するのがミソ

<?php
//  MongoDBのクライアント作成
$client = new MongoClient();
//  データベースに接続
$database = $client->selectDB('sampledb');
//  コレクションを指定
$collection = $database->selectCollection('logdata');
//  検索条件(WHERE key = '1234567')
$where = array('key' => "1234567");
//  ソート条件を指定する(ORDER BY lastdate DESC, lasttime DESC)
//  ソート条件は-1でDESC, 1でASC
$order_by = array('lastdate' => -1, 'lasttime' => -1);

//  まずは指定条件での検索結果を受け取る
$cursor = $collection->find($where);
//  検索結果をソートする
$cursor->sort($order_by);
//  最新のデータのみがほしいので1件に結果を絞る
$cursor->limit(1);
//  カーソルからデータを取得する
$result = $cursor->next();

var_dump($result);

//  データの更新
//  [SQLで言えば]
//  UPDATE logdata SET name='ABCDEFG' WHERE key = '1234567'
//
$set = array('name' => 'ABCDEFG');
$collection->update($where, array('$set' => $set));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/08 15:48

    $cursor = $collection->find($where);

    この結果がcursorに入って来ていないようです。

    var_dump($cursor) としても
    object(MongoCursor)#4 (0) { }
    となります。

    検索キーを複数に指定するつもりで、

    $where = array('key' => "$key",'myid' => "$myid",'toid' => "$toid" ,'kind' => "$kind" );
    としましたが、状況は同じで
    複数ではなく、1つだけとして

    $where = array('key' => "$key" );

    としてやってみましたが、結局
    結果として var_dump で表示される内容は同じでした。

    キャンセル

  • 2015/08/03 12:38

    横から失礼します。
    findした結果をそのまま`var_dump` しても要素をみることはできないです。
    この時は `iterator_to_array` という関数を使うと配列に変換して見ることが出来ます。
    (参考 http://php.net/manual/en/function.iterator-to-array.php )

    `var_dump(iterator_to_array($cursor));`
    で中身を確認できるかと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    25496questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MongoDB

    295questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。