MongoDb 3.0 C#更新子文档

时间:2015-12-01 14:30:02

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

以下是我的文档示例。我试图根据CostReportingPeriods元素的id更新CostReports部分。

{
"_id" : "240106",
"CostReportingPeriods" : [ 
    {
        "FyBgnDt" : ISODate("2000-01-01T05:00:00.000Z"),
        "FyEndDt" : ISODate("2000-12-31T05:00:00.000Z"),
        "_id" : "240106-20000101-20001231",
        "CostReports" : []
    }, 
    {
        "FyBgnDt" : ISODate("2001-01-01T05:00:00.000Z"),
        "FyEndDt" : ISODate("2001-12-31T05:00:00.000Z"),
        "_id" : "240106-20010101-20011231",
        "CostReports" : []
    }, 
    {
        "FyBgnDt" : ISODate("2002-01-01T05:00:00.000Z"),
        "FyEndDt" : ISODate("2002-12-31T05:00:00.000Z"),
        "_id" : "240106-20020101-20021231",
        "CostReports" : []
    }, 
    {
        "FyBgnDt" : ISODate("2003-01-01T05:00:00.000Z"),
        "FyEndDt" : ISODate("2003-12-31T05:00:00.000Z"),
        "_id" : "240106-20030101-20031231",
        "CostReports" : []
    }
]

我正在使用以下代码尝试更新该元素,但是收到一条错误,指出无法使用元素(CostReportingPeriods of CostReportingPeriods.CostReports)来遍历该元素。如果我添加CostReportingPeriods.0.CostReports,它将把它添加到数组的第一个元素,而不管过滤器。

var builder = Builders<MongoModels.Provider>.Filter;
var filter = builder.Eq("_id",costReport.PRVDR_NUM) & builder.Eq("CostReportingPeriods._id", costReport.UNIQUE_ID);
var update = Builders<MongoModels.Provider>.Update.AddToSet("CostReportingPeriods.CostReports", Mapper.Map<CostReport, MongoModels.CostReport>(costReport, opt =>
          {
              opt.AfterMap((src, dest) => dest.Worksheets = CreateWorksheets(dest.RptRecNum).ToList());
          }));

如何根据子文档的id更新我希望它更新的元素?

1 个答案:

答案 0 :(得分:1)

在尝试了很多不同的事情之后,通过将我的更新过滤器从“CostReportingPeriods.CostReports”更新为“CostReportingPeriods。$。CostReports”,它可以完美地运行。