0

サブドキュメントとサブサブドキュメントを含むドキュメントがあります

{
 "ClockID" : "fd51b6e0-5b81-49ab-8424-71fd768281b2",
 "ClockName" : "AAA-TEST123-002",
 "FilesList" : [{
                 "FileName" : "AAA-TEST123-002.mpg",
                 "FileLocationHistory" :    [{
                                               "FullPath" : "192.168.32.166/Ingestion",
                                               "AllowDeleteOnCancel" : false,
                                               "_id" : "565b7343-9dc5-4916-a788-0f392fce2502"
                                    }],
                  "_id" : "15b54499-a0be-4278-82ed-58c82c13bd40",
               }],
 "_id" : ObjectId("510164d0a63cfa2250fd6d19"),
 "_t" : "ClockRecord"

これは3つのクラスにマップされます:

public class ClockRecord : IDatabaseRecord
{
      public ClockRecord()
      {
         FilesList = new List<ClockRecordFile>();
      }
      public string ClockID { get; set; }
      public string ClockName { get; set; }        
      public List<ClockRecordFile> FilesList { get; set; }
      public BsonObjectId _id { get; set; }
}

public class ClockRecordFile
{
     public ClockFileRecord()
     {
         FileLocationHistory = new List<ClockFileLocationHistoryRecord>();
     }
     public string FileName { get; set; }
     public string FileStatus { get; set; }
     public string _id { get; set; }
 }

public class ClockFileLocationHistoryRecord
{
    public string FullPath { get; set; }
    public bool AllowDeleteOnCancel { get; set; }
    public string _id { get; set; }
}

そして、このメソッドを使用して、最上位のドキュメントを取得します。

public List<ClockRecord> GetClocksByID(string id)
{
   var collection = MongoDatabase.GetCollection<ClockRecord>(Collections.Clocks);
   var query = from e in collection.AsQueryable()
            where e._id == ObjectId.Parse(id) 
             select e;

   var clocks = query.ToList();
   return clocks;
}

したがって、FilesList配列のサブドキュメントを更新する場合は、次を使用します。

    public void UpdateClocksFilesRecord(string collectionName, ClockFileRecord clockFileRecord, BsonObjectId clockDocumentID)
    {
        var mongoCollection = MongoDatabase.GetCollection<ClockRecord>("Clocks");
        var update = Update.Set("FilesList.$", BsonDocumentWrapper.Create<ClockFileRecord>(clockFileRecord));
        var modeResult = mongoCollection.Update(
                Query.And(
                Query.EQ("_id", clockDocumentID),
                Query.ElemMatch("FilesList", Query.EQ("_id", clockFileRecord._id))
                ),
                update, UpdateFlags.Upsert
                );
    }

これは正常に機能します。

FilesList.FileLocationHistory配列のサブサブドキュメントを更新する場合は、次を使用します。

    public void UpdateClockFilesLocationRecord(string collectionName, ClockFileLocationHistoryRecord clockFileLocationHistory, BsonObjectId clockDocumentID, string clockFileDocumentID)
    {
        var mongoCollection = MongoDatabase.GetCollection<ClockRecord>("Clocks");
        var update = Update.Set("FilesList.$.FileLocationHistory", BsonDocumentWrapper.Create<ClockFileLocationHistoryRecord>(clockFileLocationHistory));
        var modeResult = mongoCollection.Update(
             Query.And(
                Query.EQ("_id", clockDocumentID),
                Query.EQ("FilesList._id", clockFileDocumentID)
                ), 
              update, UpdateFlags.Upsert
              );
    }

これにより、サブサブドキュメントは正常に更新されますがGetClocksByID()、ドキュメントを逆シリアル化するために実行すると、エラーが発生します。

「ClockRecordクラスのFilesListプロパティの逆シリアル化中にエラーが発生しました:

ClockFileRecordクラスのFileLocationHistoryプロパティの逆シリアル化中にエラーが発生しました。

要素名はFullPathではなく'_t'である必要があります。 "

これで、FileLocationHistoryドキュメントには編集前にプロパティ_tがなく、正常に逆シリアル化されました(最上位のドキュメントには_tがあります)。

ドライバーは、更新後にドキュメントに_tプロパティがあることを期待しているのはなぜですか?そして、私はそれについて何をすべきですか?

追加:私が見ることができる唯一の変更は、FileLocationHistoryドキュメントが更新後にフィールドの順序を変更することです。これが関係するかどうかはわかりません。

4

1 に答える 1

-1

OK、問題は、私の更新コードがFileLocationHistoryをドキュメントの配列からオブジェクトに変換していることです。私はこれを新しい質問として投稿しました:

「サブドキュメントを更新すると、サブドキュメントの配列の性質が削除されるのはなぜですか」

于 2013-01-28T17:21:07.833 に答える