oto-nari
データベースのコレクション削除確認画面

MongoDBでハマったけどいい感じの情報が無くて躓いた所1

Kojiro Tanaka (更新: )

MongoDBでハマったけどいい感じの情報が無くて躓いた所1

但し書き

ODBCでExcelからMongoDB BI Connectorに繋ぐ時のtips

空白文字を含むcollection(view)の削除

DDLをテキストエディタで書いてシェルに貼り付けて……ってやった時にターミナルがバグって空白文字を含むviewを作っちゃった時に消せない

MongoDBでハマったけどいい感じの情報が無くて躓いた所1

Atlasからも……

MongoDBでハマったけどいい感じの情報が無くて躓いた所1

consoleからもfalse(collectionが存在しない)が返ってくる……

そんな時は show tables と打つと空白文字が連続したviewであることがわかる

MongoDBでハマったけどいい感じの情報が無くて躓いた所1

db['view_sale_by_customer_and_use_ _y r'].drop(); と打てばtrue(削除完了)が返ってくる。

BI Connectorで作ったviewが表示されない

オンプレのBI Connectorの場合はmongosqldの引数に --sampleNamespaces書かなきゃいけないのだが、MongoDB Atlasにはそのようなオプションが存在しない、が、元からBI ConnectorではViewが表示されるようになっているので問題ない。
ただし、mongosqldは単純なMongoDBのレプリカではないので、データソースに若干のディレイがあることに注意する。

日本時間で集計したい

細かい事情はあると思うがだいたい関数によって年,月,日フィールドを取り出す場合、それらはUTCで評価されるので手動で時間のオフセットを取って計算してあげるといいらしい。

{$and: [{
    $eq: [
      "$year", {
        $toString: {
          $year: {
            $add: [
              new Date(), 
              9 * 60 * 60 * 1000
            ]}}}]}]}

「2020年」みたいな文字列と「現在年」を比較する時。
new Date() で作ってyear関数を使うとUTCで評価されるので、オフセットを行わない場合、2020年1月1日8時59分に実行されると2019が返ってくる。
aggregateで変数を使ってmatchで上記のような条件式を当てたい場合、matchの中でaddとかyearとかtoStringは使えないので一旦projectセクションでフィールド上に現在年の定義をしておくこと。

作ったViewが遅い

MongoDBでハマったけどいい感じの情報が無くて躓いた所1

MongoDB Compass上でViewを開く時、クエリが返ってこない場合はMAXTIMEMSを長めに指定する。

そもそものViewが遅すぎる場合はオンデマンドマテリアライズド・ビューを検討する。元データを余すこと無く更新できるよう集計処理を書く必要がありますが……

シェア
← 記事一覧へ