我有一个包含此表单文档的集合:
{
"_id" : ObjectId("50f81542a63cfa27fca7df43"),
"_t" : "ClockRecord",
"ClockName" : "AAA-TEST123-002",
"IngestionDateTime" : ISODate("2013-01-17T15:14:10.757Z"),
"FilesList" :
[
{
"FileName" : "AAA-TEST123-002.mpg",
"FileStatus" : "Arriving",
},
{
"FileName" : "AAA-TEST123-002.aiff",
"FileStatus" : "Arriving",
}
]
}
使用这两种类型:
public class ClockRecord : IDatabaseRecord
{
public ClockRecord()
{
FilesList = new List<ClockRecordFile>();
}
public string ClockName { get; set; }
public DateTime IngestionDateTime { get; set; }
public List<ClockRecordFile> FilesList { get; set; }
public BsonObjectId _id { get; set; }
}
public class ClockRecordFile
{
public string FileName { get; set; }
public string FileStatus { get; set; }
}
我已经阅读了很多Stack回复和mongodb网站,这似乎是正确的技术:
var collection = MongoDatabase.GetCollection<ClockRecord>("Clocks");
var update = Update.Set("FilesList.FileStatus", "TEST");
var result = collection.Update(
Query.And(
Query.EQ("_id", clockDocumentID),
Query.ElemMatch("FilesList",Query.EQ("FileName","AAA-TEST123-002.mpg"))
),
update, UpdateFlags.Upsert
);
但没有任何反应。 如何更新子文档中的FileStatus?
我的最终目标是用不同的子文档替换FilesList子文档,这样如果你知道如何做到这一点,那将是一个奖励。
答案 0 :(得分:6)
似乎代码的Update.Set部分应该有一个$。
这有效
var collection = MongoDatabase.GetCollection<ClockRecord>("Clocks");
var update = Update.Set("FilesList.$.FileStatus", "TEST"); <-----$ added here
var result = collection.Update(
Query.And(
Query.EQ("_id", clockDocumentID),
Query.ElemMatch("FilesList",Query.EQ("FileName","AAA-TEST123-002.mpg"))
),
update, UpdateFlags.Upsert
);
答案 1 :(得分:0)
上述解决方案的问题在于它只会更新数组中的第一个匹配文档。使用$运算符,您只能更新第一个匹配的文档。目前,mongodb不提供使用位置运算符($)更新多个数组元素的功能。看看下面的链接 https://jira.mongodb.org/browse/SERVER-1243