C# Mongo DB 修改多層巢狀集合中的欄位
阿新 • • 發佈:2020-08-25
雖然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
直接上程式碼
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);
}
第一次寫問隨筆沒什麼經驗 ^ - ^