【问题标题】:Add item in nested array (mongodb and C#)在嵌套数组中添加项目(mongodb 和 C#)
【发布时间】:2018-01-07 18:39:55
【问题描述】:

我有以下名为“出勤”的文件

{
    "_id" : ObjectId("5a4ffb00762caf6b54f61ebb"),
    "AttnDate" : ISODate("2018-01-05T22:24:00.490Z"),
    "AllAttendances" : [ 
        {
            "FullName" : "DOMAIN\Zack",
            "Logged" : ISODate("2018-01-05T22:23:46.835Z"),
            "Pauses" : [
                {
                    PauseStartAt: ISODate("2018-01-05T22:30:46.835Z"),
                    PauseEndAt: ISODate("2018-01-05T22:35:46.835Z")
                }
            ]
        }
    ]
}

如何将新项目添加到暂停。这是我的尝试,但出现此错误“无法将 lambda 表达式转换为类型 'fielddefinition,因为它不是委托类型。

我的尝试

var filter = Builders<Attendance>.Filter.Eq(a => a.Id, currentAttn.Id) & Builders<Attendance>.Filter.ElemMatch(s => s.AllAttendances, Builders<TimeRecord>.Filter.Eq(n => n.FullName, userName));
var update = Builders<Attendance>.Update.Push(e => e.AllAttendances[-1].Pauses, pauses);
context.Attendances.FindOneAndUpdate(filter, update);

我关注了这个guide

考勤班

public class Attendance
{
    [JsonConverter(typeof(ObjectIdConverter))]
    public ObjectId Id { get; set; }
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime AttnDate { get; set; }
    public List<TimeRecord> AllAttendances { get; set; }
}

TimeRecord 类(AllAttendances)

public class TimeRecord
{
    public string FullName { get; set; }
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime Logged { get; set; }
    public List<Pause> Pauses { get; set; }
}

暂停课

public class Pause
{
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime PauseStartedAt { get; set; }
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime PauseEndedAt { get; set; }
}

【问题讨论】:

    标签: c# mongodb poco


    【解决方案1】:

    您需要将过滤器更新为

    var filter = Builders<Attendance>.Filter.Eq(a => a.Id, id) &
                 Builders<Attendance>.Filter.ElemMatch(s => s.AllAttendances, x => x.FullName == userName);
    

    ElemMatch的第一个参数是字段,第二个参数是过滤器。

    【讨论】:

      【解决方案2】:

      换个角度看,我建议你不要在c#中使用ObjectID。我总是在我的模型中将 ObjectIds 定义为字符串,并使用 Bson 属性装饰器将它们定义为数据库中的 ObjectId

      [BsonId]
      [BsonRepresentation(BsonType.ObjectId)]
      public string Id { get; set; }
      

      纯粹是因为尝试在 C# 中使用 ObjectIds 所带来的痛苦。字符串更容易处理。您在 mongodb 中的文档看起来仍然相同,并且您根本不需要在代码中转换为对象 id:

      _id : ObjectId("xxxxxxx")
      

      这应该可以帮助您解决编译器不知道如何进行转换的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        相关资源
        最近更新 更多