我有一个包含子文档和子子文档的文档
{
"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 文档在更新后更改了字段的顺序。我不知道这是否相关。