如何使用MongoDB和C#驱动程序更新子文档集合

3

我有一个包含以下形式文件的集合:

{
    "_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子文档,如果您也知道如何做到这一点,那将是一个额外的奖励。

2个回答

7
似乎代码的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
);

0
以上解决方案的问题在于它只会更新数组中第一个匹配的文档。使用$运算符,您只能更新第一个匹配的文档。目前,MongoDB不提供使用位置运算符($)更新多个数组元素的功能。请查看下面的链接https://jira.mongodb.org/browse/SERVER-1243

真的,但我的文件名在时钟文档中是唯一的,所以我可以这样做。为每个子文档添加一个_id(稍后我也这样做了)会给您一个适当的唯一键,可用于Query.ElemMatch("FilesList", Query.EQ("_id", clockFileRecord._id))。 - Richard210363

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接