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

MongoDB

但し書き

  • MongoDB関係のドキュメントに関してトラブルシューティングの情報が他の有名所のRDBMSと比較して少ないので備忘録的に書いたものを公開します。
  • バージョンは明記しませんが大体2020年にMongoDB Atlasで構築した最新版の環境です。

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

  • BI Connectorのバージョンは1.4.2ではなぜか繋がらなかったので1.3.0を使った
  • Windows10(64bit)でExcel(Office2019)からODBCを呼ぶ場合は32bitドライバが使われた(心配なら32bit/64bit両方インストールしても良いかも)
  • ODBC DriverはANSIとUnicodeを選べるが日本語環境の場合はANSIだと「cp932って何」って怒られるのでUnicodeじゃないと繋がらないと思う(パフォーマンスが悪い、とドキュメントに書いてあるが……)

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

DDLをテキストエディタで書いてシェルに貼り付けて……ってやった時にターミナルがバグって空白文字を含むviewを作っちゃった時に消せない
Atlasからも……
consoleからもfalse(collectionが存在しない)が返ってくる……
そんな時は show tables と打つと空白文字が連続したviewであることがわかる
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が遅い

  • lookupで当てるコレクションのフィールド、filterやmatchするフィールドは必ずindexを貼る。
MongoDB Compass上でViewを開く時、クエリが返ってこない場合はMAXTIMEMSを長めに指定する。
そもそものViewが遅すぎる場合はオンデマンドマテリアライズド・ビューを検討する。元データを余すこと無く更新できるよう集計処理を書く必要がありますが……