簡體   English   中英

在嵌套數組中添加項目(mongodb和C#)

[英]Add item in nested array (mongodb and C#)

我有以下文件稱為“出勤”

{
    "_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);

我遵循了本指南

出勤班

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類(所有出席情況)

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; }
}

您需要將過濾器更新為

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

ElemMatch的第一個參數是字段,第二個參數是過濾器。

從另一個角度來看,我建議您不要在c#中使用ObjectID。 我總是在模型中將ObjectId定義為字符串,並使用Bson屬性修飾符在數據庫中將其定義為ObjectId

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

純粹是因為它導致嘗試在C#中使用ObjectIds的痛苦。 字符串更容易處理。 您在mongodb中的文檔看起來仍然相同,並且根本不需要在代碼中將其轉換為對象ID:

_id : ObjectId("xxxxxxx")

這應該可以幫助您解決編譯器不知道如何進行轉換的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM