1. 程式人生 > 實用技巧 >C# Mongo DB 修改多層巢狀集合中的欄位

C# Mongo DB 修改多層巢狀集合中的欄位

雖然c#的mongo 驅動很強大,而且還支援linq,但是一些複雜的操作語句還是比較困難

下面用Bson實現功能

  • 這是模型(我這裡有多層巢狀)

  • public class CtStreetPurpose
        {
           
            public long Id { get; set; }
    
            public List<StreetPurpose> StreetPurposes { get; set; }
        }
    
     public class StreetPurpose
        {
            public long BuyerId { get
    ; set; } public string Remark { get; set; } public string RemarkName { get; set; } public List<PurposeStreetId> StreetIds { get; set; } public string PurposeCategory { get; set; } public int Top { get; set; } public string Content { get
    ; set; } public long FollowTime { get; set; } public long UpdateTime { get; set; } } public class PurposeStreetId { public long Id { get; set; } public long StreetId { get; set; } }   

  

直接上程式碼

public async Task UpdateStreetPurpose(CtStreetPurpose create)
        {

var writeModels = new List<WriteModel<CtStreetPurpose>>();
foreach (var purpose in create.StreetPurposes) {
//過濾條件
var filter = new BsonDocument { {"_id",create.Id},//在monogo db 裡面id是_id
//第一層巢狀中的欄位過濾 {
"StreetPurposes",new BsonDocument { {"$elemMatch",new BsonDocument{{ "BuyerId", purpose.BuyerId}}} } }, };

//構建一個bson陣列存放需要插入集合的資料 var streetIdsBsonArray = new BsonArray(); foreach (var streetIds in purpose.StreetIds) { var streetIdsBson = new BsonDocument { {"_id", streetIds.Id}, {nameof(PurposeStreetId.StreetId), streetIds.StreetId} }; streetIdsBsonArray.Add(streetIdsBson); }

//更新
var update = new BsonDocument { {
//插入集合
"$push",new BsonDocument { {
//如果不是插入集合--這裡需要修改
"StreetPurposes.$.StreetIds",new BsonDocument { {"$each",streetIdsBsonArray} } } } } };

writeModels.Add(new UpdateManyModel<CtStreetPurpose>(filter, update) { IsUpsert = true }); // IsUpsert--強制更新
            } 

await collection.BulkWriteAsync(session, writeModels);
}

第一次寫問隨筆沒什麼經驗 ^ - ^