MongoDBのコレクションインデックスをC#で追加(TTLの設定など)

 C#でTTLの設定などをやっているサンプルがなかなか見つからなかったのでメモ。
 まず必要なパッケージなど。
using MongoDB.Bson;

using MongoDB.Driver;
using System;
using System.Collections.Generic;


 あとは接続からインデックス作成まで。
var client = new MongoClient();

var db = client.GetDatabase("test");

var collectionName = "Foo";
var keyName = "createdAt";

var fieldDefinition = new StringFieldDefinition<BsonDocument>(keyName);
var indexDefinition = new IndexKeysDefinitionBuilder<BsonDocument>().Ascending(fieldDefinition);
var options = new CreateIndexOptions()
{
ExpireAfter = TimeSpan.FromSeconds(10)
};


db.GetCollection<BsonDocument>(collectionName)
.Indexes.CreateOne(indexDefinition, options);


var models = new List<CreateIndexModel<BsonDocument>>();
var model1 = new CreateIndexModel<BsonDocument>(indexDefinition, options);
models.Add(model1);

db.GetCollection<BsonDocument>(collectionName)
.Indexes.CreateMany(models);
comment: 0

.NET Core +xUnit + MongoDBなテストをTravisCIでCIする

 .NET CoreによるMSの積極的なLinux参入。VisualStudioで.NET Coreのテストを作ろうとするならxUnitを使ったテストを選べる。これをTravisCI上でのUbuntu(trusty)で走らせるところまで持っていく。

 VisualStudioで.NET CoreのxUnitテストを作る。それをコマンドラインで走らせるところから。
 ソリューションの真下の.slnのあるディレクトリで、restoreとbuildを行う。
dotnet restore

dotnet build

 そんでテスト。テストはテストプロジェクトのあるディレクトリに移動して行う。
dotnet test



 テストが済んだことを確認したら、それをTravisCIで行えるようにする。.travis.ymlの用意。今回はMongoDBを使うのでその設定も。
.travis.yml

sudo: false
language: csharp
mono: none
dotnet: 1.0.1
dist: trusty
services:
- mongodb
addons:
apt:
sources:
- mongodb-upstart
- mongodb-3.0-precise
packages:
- mongodb-org-server
- mongodb-org-shell

install:
- dotnet restore
script:
- dotnet build
- cd FoobarTests
- dotnet test


 上記のものを利用してじっさいにTravisCIに上げてみたのが↓のプロジェクト。



https://travis-ci.org/hMatoba/Mango
comment: 0

ASP.NET Core MVCとMongoDBの組み合わせのためにコードファーストができるライブラリを作った

 MVCでWebアプリを作っているなら、モデルを書いているはず。データベースがリレーショナルデータベースなら、C#ではEntityFrameworkが使えるはず。なのでモデルをちゃんと書くだけでデータベースもよしなに扱える。MongoDBはかつてはEntityFrameworkでいけたが、今はサポートを切られてしまっている。
 今作っているものはC# + MongoDB。サポートを切られているとはいえ、コードファーストは導入したい。だからモデルを定義しておけばよしなにMongoDBでコレクションを扱ってくれるものを書くことにする。そんでもって書いた。
using Mango;


 まず。MongoDBでCRUDすることを考えた従来のモデルの基本的部分。
class Model1

{
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }

[BsonElement("token")]
[BsonRepresentation(BsonType.String)]
public string Token { get; set; }
}


 ライブラリでコードファーストをやることを考えたモデル。
[MongoDoc]

class Model1
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }

[BsonElement("token")]
[BsonRepresentation(BsonType.String)]
public string Token { get; set; }
}

// Create collection(s)
MongoInitializer.Run(connectionString, dbName, assemblyName, modelsNamespace);

これまで書いていたモデルの宣言時にMongoDoc属性をつけるだけ。それでクラス名からコレクションを作ってくれる。あとは自分でコレクション名をつけたり、コレクションの作成オプションもルールに従って定義してあればよしなにやってくれる。
 モデルを定義したら、MongoInitializer.Runメソッドを実行すればデータベースに接続してコレクションを作成してくれる。リフレクションでモデルを調べてコレクションの作成を行っているので、アセンブリ名とモデルが入ったネームスペースが必要。

 マイグレーションは実装していないが、スキーマレスだし不必要かなとも思う。

https://github.com/hMatoba/Mango
もし使いたいなんていってくる人が現れたらライセンスやら整えよう。使い方はとりあえずテストコードを見ればわかるはず…
comment: 0

遠隔でMongoDBサーバのバックアップを取る2

 前回に構築したMongoDBサーバの自動遠隔バックアップシステムを削除し、新しくバックアップシステムを組んだ。今回はMongoDBサーバでバックアップコマンドを実行し、それをAzure Blob StorageにPythonでアップするという流れ。

backup.sh

#!/bin/sh
cd /home/h/backup
mongodump --host foo -u bar -p boo
tar zcvf dump.tar.gz dump
python3.5 /home/h/up.py
rm -rf *


up.py

from azure.storage.blob import BlockBlobService
import datetime

account = "xxx"
key = "yyy"
block_blob_service = BlockBlobService(account_name=account, account_key=key)
filename = datetime.datetime.now().strftime("%Y%m%d")
block_blob_service.create_blob_from_path("mongo", filename, "dump.tar.gz")



comment: 0

遠隔でMongoDBサーバのバックアップを取る1

 クッソなバックアップシステムを組んでしまった。まあとりあえず動く。だからメモとして残すが、バックアップシステムは組みなおす。



 MongoDBのホスティングサービスを使いたいのだが、経済的な理由から安いVPSをMongoDBサーバにしている。
ConoHaにMongoDBサーバを立てた

 ↑の自動バックアップを組みたい。バックアップは外部に置く。外部にバックアップを置くことを考えると、もっとも簡単な方法は、バックアップを置く端末からバックアップコマンドを実行することだろう。
mongodump --host foo -u bar -p pw


 うちの常時稼動RaspberryPiで上記を実行したい。しかしそのコマンドが入ったMongoDB ToolsはARMでは64bit用しか用意されていない。標準のRaspbianは今のところ32bitOSなので今のところ無理。経済的に超ローコストで問題を解決したい。
 RaspberryPiにMongoDB Toolsは入れられん。だけどAzureのCLIは入れられる…
・RaspberryPiでAzureのVMの電源を入れたり切ったり
→AzureのVMにMongoDB Toolsを入れてそっちでバックアップ
 上記のようにすれば、VMの電源は一時的にしか入らないので大したコストはかからん。

 まずRaspberryPiにAzureCLIを入れて、VMの電源をコントロールできるようにする。AzureCLIをインストールしたら、下記のような.shを用意してCRONで走らせるようにする。
az login -u foo -p bar

az account set -s xxx-xxx-xxx
az vm start -g xxx -n yyy
#az vm deallocate -g xxx -n yyy


 次にVMでmongodumpコマンドをCRONに入れる。これでMongoDBサーバのバックアップが自動でとれるようになった。しかもVMは一時的にしか電源が入らないからコストにはならん…アホらし。
 MongoDBサーバのバックアップを取るのに、コストを抑えるためだからってわざわざこんな構成組むのはアホらし。
・問題解決はシンプルに
・金を払ってシンプルに解決できるならそれで
・金がなくても極力シンプルに


 課題はシンプルに解決する。一通り組み終わって、べつの解決法を思いついたのでバックアップシステムの組み直し。
comment: 0