MongoDB memo

mongoDBについて

公式ドキュメント

MongoDB PHP Library — PHP Library Manual 1.4

概要

やってみようNoSQL MongoDBを最速で理解する - Qiita


環境

CentOS Linux release 7.6.1810 (Core)
PHP Version 7.2.11

MongoDB shell version v3.6.10
git version: 3e3ab85bfb98875af3bc6e74eeb945b0719f69c8
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
    distmod: rhel70
    distarch: x86_64
    target_arch: x86_64

PHPから使う

composerコマンドが使えない場合はcomposerをインストールする

require_once __DIR__ . "/vendor/autoload.php";

日付の扱い

  • MongoDBでは協定世界時(UTC)で時間が表現されており、JST(日本時間)とUTCには時差がある
  • DBにはミリ秒で格納されるため、

下記、
「Z」はUTCであることを示す。
「T」は日付と時間を分けるための記号。

ISODate("2016-10-21T15:00:00Z")

コード例

Mongo DBに接続

  • 接続情報設定
$user = "ユーザーID";
$pwd  = "パスワード";
$host = "localhost";
$port = ポート番号;
$db = "DB名";

クライアントに接続

$client = new MongoDB\Client("mongodb://${user}:${pwd}@${host}:${port}/${db}");

コレクションを指定

$collection = $client -> DB名 -> コレクション名;
例)
$collection = $client -> seisansei_db_dev -> userMaster;

コレクションから情報取得

  • 全件
$result = $collection -> find();
  • 絞り込み(下記例は、ユーザーIDを指定)
$result = $collection -> find(['userId' => 'test01']);

取得データを展開(下記例は、ユーザー名を指定)

foreach ($result as $value) {
    $userName = $value['userName'];
}

データ追加

  • 1件のみ
$result = $collection->insertOne([
    'userId' => $userid,
    'mode' => $mode,
    'answerDate' => $answerDate,
    'seatId' => $seatId,
    'score' => $score,
    'opinion' => $opinion ,
]);
  • 複数
$result = $collection->insertMany(
[
    'userId' => '001',
    'mode' => 'mode01',
],
[
    'userId' => '002',
    'mode' => 'mode02',
]);

追加するデータは変数で管理すると楽。
array_pushをforeach内で実行するなどして作成。

$documents = [];
array_push($documents, [
    'userId' => '002',
    'mode' => 'mode02',
]);
$result = $collection->insertMany($documents);

データ更新

  • 注意事項 -- https://ota42y.com/blog/2015/12/02/mongodb_update/ -- MongoDB の update はレコードのID以外の要素を全て置き換える -- 指定したカラムだけ置き換えてはくれない -- 部分 update したい場合は、$setでを使う

  • 指定したデータの一部だけ更新

-- 1件(更新のみ)

$result = $collection->updateOne(
  [ 'userId' => $_SESSION['userid'] ],
  [ '$set' => [ 'mailAddr' => $mailAddr ]]
);

-- 1件(更新後、そのデータを取得)

$updateResult = $collection->findOneAndUpdate(
  [ 'userId' => $user_id ],
  [ '$set' => [ 'sheetAssignmentLog.0.beginDate' => $utc_seatAssignDate ] ]
);
  • 配列要素の指定 例)下記のような構造の場合は「.」で区切って指定

年を指定:datatime.0.year 月を指定:datatime.0.month

"datatime" : [
    0:[
        "year" : 2019,
        "month" : 4,
        "day" : 10
    ],
    1:[
        "year" : 2019,
        "month" : 5,
        "day" : 20
    ]
]

データ削除

-1件削除

$result = $collection->deleteOne(['userId' => '001']);

-複数件削除

$result = $collection->deleteMany(['userId' => '001']);