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 属性时出错:

预期的元素名称是 '_t',而不是 FullPath。”

现在 FileLocationHistory 文档在编辑之前没有属性 _t 并且它反序列化得很好(顶级文档确实有 _t)。

为什么驱动程序希望文档在更新后具有 _t 属性?我该怎么办?

附加:我能看到的唯一变化是 FileLocationHistory 文档在更新后更改了字段的顺序。我不知道这是否相关。

4

1 回答 1

-1

好的,问题是我的更新代码将 FileLocationHistory 从文档数组转换为对象。我已将此作为一个新问题发布:

“为什么我对子文档的更新会删除子文档的数组性质”

于 2013-01-28T17:21:07.833 回答