オブジェクトを埋め込みドキュメントとして挿入する汎用メソッドを作成しようとしています。以下のコードは既に機能していますが、リポジトリに配置してコントローラーから呼び出すことができる汎用メソッドを作成する必要があります。ルート ID と、挿入する必要があるサブドキュメント オブジェクトを渡す必要があります。
class Post
{
...
public IList<Comment> Comments { get; set; }
}
using (var db = Mongo.Create(session.ConnectionString()))
{
IMongoCollection<Post> _collection = db.GetCollection<Post>("Post");
var comment = new Comment();
comment.InjectFrom(commentViewModel.comment);
// Use below to add *NEW* embedded document
_collection.UpdateOne(
new { _id = commentViewModel.Id },
new { Comments = M.AddToSet(comment) }
);
}
例として、これはドキュメントを取得するために使用するものです。挿入に似たものを探しています:
// Controller
var session = new MongoSession();
var post = session.Single<Post>(c => c.Id == id);
//Repository
public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new()
{
T retval = default(T);
using (var db = Mongo.Create(_connectionString))
{
retval = db.GetCollection<T>().AsQueryable()
.Where(expression).SingleOrDefault();
}
return retval;
}
アップデート
次の呼び出しに注意してください。
_collection.UpdateOne(
new { _id = commentViewModel.Id },
new { Comments = M.AddToSet(comment) }
)
私が必要とすることを行います、私はそれを次のようなものへの一般的な呼び出し(より良い言葉がないため)にできるようにしたいだけです(作業バージョンを除く):
//Controller
var session = new MongoSession();
session.AddSubDocument<>(new Post { Id = commentViewModel.Id }, new { Comments = M.AddToSet(comment) });
// Repository ==> NOT WORKING SAMPLE
public void AddSubDocument<X, U>(X matchDocument, U valueDocument)
{
using (var db = Mongo.Create(_connectionString))
{
db.GetCollection<X>().UpdateOne(matchDocument, valueDocument);
}
}
それがより理にかなっていることを願っています。
ありがとう、マイク