mongo

(メモ)mongodbから抽出したいデータだけ抽出,

More than 1 year has passed since last update.

mongodbから抽出したいデータだけ抽出する

■2017年10月1日の日報抽出(pages)

db.pages.find({path: "/user/test/日報/2017/10/01"})
{ "id" : ObjectId("59c3d9584428d8f705f5dce2"), "redirectTo" : null, "updatedAt" : ISODate("2017-09-21T15:23:04.655Z"), "lastUpdateUser" : ObjectId("58fa23767ffd2fbb09ef557d"), "creator" : ObjectId("58fa23767ffd2fbb09ef557d"),
"path" : "/user/test/日報/2017/10/01", "createdAt" : ISODate("2017-09-21T15:23:04.592Z"), "extended" : "{}", "commentCount" : 0, "seenUsers" : [ ObjectId("58fa23767ffd2fbb09ef557d") ], "liker" : [ ], "grantedUsers" :
[ ObjectId("58fa23767ffd2fbb09ef557d") ], "grant" : 1, "status" : "published", "
_v" : 1, "revision" : ObjectId("59c3d9584428d8f705f5dce3") }

■2017年10月の日報を抽出(pages)
db.pages.find({path: "/user/test/日報/2017/10"})

■2017年10月1日の本文抽出(revisions)

db.revisions.find({path: "/user/test/日報/2017/10/01"})
{ "id" : ObjectId("59c3d9584428d8f705f5dce3"), "author" : ObjectId("58fa23767ffd2fbb09ef557d"), "body" : "# 日報/2017/10/01\r\n\r\n# 使用オーダ\r\n\r\n|開始時刻|終了時刻|オーダ番号|備考|\r\n| --- | --- | --- | --- |\r\n|08:30|17:15|7002|支援|\r\n|17:15|19:00|その他|業務報告等|\r\n\r\n# 関連FAQ\r\n\r\n* 搬送の規約番号に「0」と入力しても機能するのか。  ←その日登録するつもりor登録した FAQのタイトル\r\n* テストの見分け方はありますか?\r\n\r\n ", "path" : "/user/test/日報/2017/10/01", "createdAt" : ISODate("2017-09-21T15:23:04.651Z"), "format" : "markdown", "_v" : 0 }

■/を入れることにより表示される(revisions)
db.revisions.find({path: /^\/user\/test\/日報\/2017\/10\//})

■revisionに登録されている本文が表示される
db.pages.find( { "path": /^\/user\/test\/日報\/2017\/10\//} ).forEach(function(doc){db.revisions.find({ "_id": doc.revision }).forEach(function(item){print( item.path );item.body.match(/|\d+:\d+|.|\d\d\d\d|.|.*|/gi).forEach(function( order ){print( order );})})})

本文表示
/user/test/日報/2017/10/01
|08:30|17:15|東京|1000|東京支援|鈴木|
/user/test/日報/2017/10/02
|08:30|17:15|東京|1000|東京支援|鈴木|

■サンプルテキストにオーダ表(2017年10月のtest日報)を代入する
cat <<'EOF' |mongo > sample.txt
use crowidb
db.pages.find( { "path": /^\/user\/test\/日報\/2017\/10\//} ).forEach(
function(doc){
db.revisions.find({ "_id": doc.revision }).forEach(function(item){
print( item.path );
item.body.match(/|\d+:\d+|.|\d\d\d\d|.|.*|/gi).forEach(
function( order ){
print( order );
})
})
})
EOF

■オーダ管理表示(|非表示)
cat sample.txt | gawk 'BEGIN{FS="|"; OFS=",";} /^\/user/{ match($0, /\/日報\/([0-9]+\/[0-9]+\/[0-9]+)$/, m); date=m[1]; } /|/{print date,$2,$3,$4,$5,$6;}'

表示
2017/10/01,08:30,17:15,東京,7002,東京支援
2017/10/02,08:30,17:15,東京,7002,東京支援
2017/10/05,08:30,17:15,東京,7002,東京支援

■サンプルファイルなしで実行
cat <<'EOF' |mongo | gawk 'BEGIN{FS="|"; OFS=",";} /^\/user/{ match($0, /\/日報\/([0-9]+\/[0-9]+\/[0-9]+)$/, m); date=m[1]; } /|/{sub(/:/,"",$2);sub(/:/,"",$3);print date,$2,$3,$4,$5,$6;}'
use crowidb
db.pages.find( { "path": /^\/user\/test\/日報\/2017\/10\//} ).forEach(
function(doc){
db.revisions.find({ "_id": doc.revision }).forEach(function(item){
print( item.path );
item.body.match(/|\d+:\d+|.|\d\d\d\d|.|.*|/gi).forEach(
function( order ){
print( order );
})
})
})
EOF

表示
2017/10/01,08:30,17:15,東京,7002,東京支援
2017/10/02,08:30,17:15,東京,7002,東京支援
2017/10/05,08:30,17:15,東京,7002,東京支援

■シェル
createOrder.sh
-------------
#!/bin/sh

TARGET=$1; # /^\/user\/test\/日報\/2017\/10\//

cat < sample.csv
use crowidb
db.pages.find( { "path": ${TARGET}} ).forEach(
function(doc){
db.revisions.find({ "_id": doc.revision }).forEach(function(item){
print( item.path );
item.body.match(/|\d+:\d+|.|\d\d\d\d|.|.*|/gi).forEach(
function( order ){
print( order );
})
})
})
EOF

■ファイルダウンロード
[root@localhost ~]# cat /var/www/html/downroad.php


<?php
$args='/^\/user\/' . $_GET['user'] . '\/日報\/' . $_GET['y'] . '\/' . $_GET['m'] . '\//';
$cmd="/root/createOrder.sh" . " " . $args;
$output = array();

exec($cmd,$output); // スクリプトを実行

// 実行結果を出力
foreach($output as $line){
echo $line;
}
?>


[root@localhost ~]# cat createOrder.sh

!/bin/sh

TARGET=$1; # /^\/user\/test\/日報\/2017\/10\//

cat < sample.csv
use crowidb
db.pages.find( { "path": ${TARGET}} ).forEach(
function(doc){
db.revisions.find({ "_id": doc.revision }).forEach(function(item){
print( item.path );
item.body.match(/|\d+:\d+|.|\d\d\d\d|.|.*|/gi).forEach(
function( order ){
print( order );
})
})
})
EOF

最終体系

<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=order.csv"); -->

$args='/^\\/user\\/' . $_GET['user'] . '\\/日報\\/' . $_GET['y'] . '\\/' . $_GET['m'] . '\\//';
$cmd="/var/www/html/order/createOrder.sh" . " " . $args;
$output = array();

exec($cmd,$output); // スクリプトを実行
// 実行結果を出力
foreach($output as $line){
echo mb_convert_encoding($line . "\r\n", "SJIS", "UTF-8");
}
?>

対象月分のみ出力

csv出力

日付出力

[root@localhost order]# cat kinmukanri_formatorder.awk #!/usr/bin/gawk -f BEGIN{ FS="|"; OFS=","; # 1日~31日まで3行分ずつの空行csv情報を持つようにlineを初期設定。 for( day=1; day <= 31; day++ ){ for( idx=0; idx<3; idx++ ){ line[day,idx] = day ",,,,,"; } idxmax[day]=idx; } } /^\/user/{ match($0, /\/日報\/([0-9]+\/[0-9]+\/([0-9]+))$/, m); date=m[1]; day=m[2]+0; idx=0; } /\|/{ sub(/:/,"",$2); sub(/:/,"",$3); # オーダー情報を記憶 if( idx == 0 ){ start[day] = $2; } end[day] = $3; line[day,idx++] = (date "," $2 "," $3 "," $4 "," $5 "," $6); if( idx > idxmax[day] ){ idxmax[day]=idx; } } END{ # 記憶しておいた情報を出力 for( day=1; day <= 31; day++ ){ for( idx=0; idx