4

この MongoDB ドキュメントがあります。私は MVC アプリケーションを開発しており、C# を使用してコメント配列 (「更新後のコメント」へのコメント付きの説明) を更新しようとしています。新しいmongodbバージョンを使用しています。

{
   "ProjectID":1,
   "ProjectName":"Project test",
   "ProjectStatus":"Active",
   "ProjectTasks":[
      {
         "ProjectTaskID":1,
         "TaskShortDescription":"short task description",
         "TaskLongDescription":"long task description",
         "Comments":[
            {
               "CommentID":1,
               "CommentDescription":"comment before update",
               "CreatedBy":"Mike",
               "UploadDocuments":{
                  "TaskID":null,
                  "CommentID":null,
                  "UploadDocumentID":1,
                  "UploadDocumentName":"first document upload"
               }
            }
         ]
      }
   ]
}

私はこれを使ってみました:

var filter = Builders<Project>.Filter.And(Builders<Project>.Filter.Eq(x => x.ProjectID, projectID), Builders<Project>.Filter.ElemMatch(x => x.ProjectTasks, x => x.ProjectTaskID == projectTaskID), Builders<Project>.Filter.ElemMatch(x => x.ProjectTasks.ElementAt(-1).Comments, x => x.CommentID == comment.CommentID));

var update = Builders<Project>.Update.Set(x => x.ProjectTasks.ElementAt(-1).Comments.ElementAt(-1).CommentDescription, comment.CommentDescription );

Collection.UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = true });

フィルターも変えてみた

var filter = Builders<Project>.Filter.And(Builders<Project>.Filter.Where(p => p.ProjectID == projectID), Builders<Project>.Filter.Eq("ProjectTasks.ProjectTaskID", projectTaskID), Builders<Project>.Filter.Eq("ProjectTasks.$.Comments.$.CommentID", comment.CommentID));

どちらの場合も、コメントのクエリ、フィルター、および更新を行うことができません。

このドキュメントのコメントを見つけて更新する方法を教えてください。どんな提案でも大歓迎です!

4

2 に答える 2

4

同様の問題に直面しました-ネストされたコレクションに新しいアイテムを挿入する必要がありました。データ構造を変更できないと仮定すると、ネストされたエンティティのインデックスを見つけて更新することが考えられます。その後、更新定義でエンティティにアクセスできるようになります。

与えられたコンテキストで私がしたことは次のとおりです。

var projectTaskIndex = await _mongoContext.Projects
    .Find(p => p.ProjectID == projectID)
    .Project(p => p.ProjectTasks.FindIndex(t => t.ProjectTaskID == projectTaskID))
    .SingleOrDefaultAsync();

var updateDefinition = new UpdateDefinitionBuilder<Project>()
    .AddToSet(p => p.ProjectTasks[projectTaskIndex].Comments, comment);

await _mongoContext.Projects
    .UpdateOneAsync(p=> p.ProjectID == projectID, updateDefinition);

同様に、コメントのインデックスを見つけて、コメントのプロパティにアクセスできます。更新定義は次のようになります。

var updateDefinition = new UpdateDefinitionBuilder<Project>()
    .Set(p => p.ProjectTasks[projectTaskIndex]
                 .Comments[commentIndex].CommentDescription,
            comment.CommentDescription);

ここで非常に重要なのは、スレッド セーフを確保することです。ProjectTasks と Comments のコレクションは、インデックスの取得と実際の更新の間で変更されてはなりません。

@Cisco、解決策を見つけましたか? もしそうなら、それを共有していただけますか?

于 2016-02-15T23:07:00.407 に答える