2011-03-14 10 views
1

オブジェクトを埋め込みドキュメントとしてインセットするための一般的なメソッドを作成しようとしています。以下のコードはすでに動作していますが、リポジトリに格納してコントローラから呼び出すことができる汎用メソッドを作成する必要があります。私はルートIDと挿入する必要があるサブドキュメントオブジェクトを渡す必要があります。呼び出すこと一般的なLINQ挿入メソッド(Norm/MongoDB)のヘルプ

// 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; 
} 

UPDATE

注:例として

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) } 
     ); 
} 

が、これは私が文書を取得するために使用するものですが、私は挿入する似たような探してい

_collection.UpdateOne(
      new { _id = commentViewModel.Id }, 
      new { Comments = M.AddToSet(comment) } 
      ) 

私が必要とするものは、私はmそれは一般的な呼び出し(より良い言葉の欠如のため)は、このようなもの(作業バージョンを除く):

//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); 
    } 
} 

ホープはそれが理にかなっています。

はマイク

答えて

1

これはjfar

public void Insert<T>(T entity) 
{ 
    using (var db = Mongo.Create(_connectionString)) 
    { 
     var collection = db.GetCollection<T>(); 
     collection.Save(entity); 
    } 
} 
+0

おかげで動作するはずですが、それが唯一の既存の1に埋め込まれた文書を追加していない、完全な文書を挿入するために働くだろう、 、ありがとうございました。 – Mikalee

+0

@Mikalee - 反射マジックなしではおそらく不可能です。ネストされたドキュメントを追加するフィールドまたはプロパティをどのように知っていますか? – jfar

+0

上記の例を見ると、すでに動作していますが、一般的なものにする方法はわかりません。したがって、_collection.UpdateOne(new {_id = commentViewModel.Id}、new {コメント= M.AddToSet(コメント)})を呼び出すことで、最初のパラメータはルートドキュメントを識別し、2番目のパラメータはそれを追加するIList Commentsフィールドを識別します。 "M.AddToSet"メソッドは私が必要とするものです - 私は私のポストにいくつかの詳細を追加します。 – Mikalee

関連する問題