簡體   English   中英

mongodb C#驅動程序在使用Update.Push時不在嵌入的對象列表中生成新添加文檔的ObjectId

[英]mongodb C# driver not generating ObjectId of newly added document in embedded list of objects when using Update.Push

我正在使用mongodb C#驅動程序並嘗試在Client列中包含的“List”中添加“Goal”實體,但是mongodb總是返回一個空的objectId og目標。

Client.cs

    public class Client
    {
    public string UserName { get; set; }

    [BsonId]
    public ObjectId ClientId { get; set; }

    [BsonIgnore]
    public string ClientIdString
    {
        get
        {
            return this.ClientId.ToString();
        }
    }

    [BsonRequired]
    public string ClientName { get; set; }

    public string EmailAddress { get; set; }

    public string CompanyName { get; set; }

    public List<Goal> Goals { get; set; }
    }

Goal.cs

public class Goal
{

    public ObjectId GoalId { get; set; }

    [BsonRequired]
    public string Title { get; set; }

    public string Description { get; set; }

    [BsonDefaultValue(State.NotStarted)]
    public State GoalState { get; set; }

    [BsonIgnore]
    public string StateString 
    {
        get
        {
            return this.GoalState.ToString();
        }
    }

}

我正在嘗試使用以下代碼將目標添加到客戶端:

IMongoQuery query = Query<Client>.EQ(eq => eq.ClientId, id);
                IMongoUpdate update = Update<Client>.Push<Goal>(push => push.Goals, goal);

                WriteConcernResult result = this.ClientCollection.Update(query, update);

但每次mongodb返回客戶端列​​表中新添加的目標的空objectId。

請指導我做錯了什么?

提前致謝。 :)

請指導我做錯了什么?

沒什么,但你期待錯誤的行為。

嵌入的文檔沒有_id 當然,你可以強制mongodb創建一個恰好具有該名稱的字段,但與root _id不同,這樣的字段沒有特殊的語義,並且沒有默認索引。 缺少這些特殊語義也是驅動程序無需為您生成字段值的原因。

一般而言,在嵌入式文檔中具有唯一索引通常是格式錯誤的數據結構的標志。 確保嚴格要求這樣的id。 如果id必須是全局唯一的,那么嵌入式文檔似乎也有意義或相關如果它有另一個父級,這表明它應該是第一級公民,即擁有自己的集合。

請記住,這也是一個所有權問題 - 並發寫入會發生什么? 當然,你可以不遺余力地只使用原子修飾符來允許對一個文檔進行不同的寫入,但這是不必要的復雜恕我直言。

暫無
暫無

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

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