c#實現 Mongodb存儲【文檔局部更新】
如下:
遞歸更新字段 ,構建UpdateDefinition
-
/// <summary>
-
/// 構建更新操作定義
-
/// </summary>
-
/// <param name="bc">bsondocument文檔</param>
-
/// <returns></returns>
-
private List<UpdateDefinition<BsonDocument>> BuildUpdateDefinition(BsonDocument bc, string parent )
-
{
-
var updates = new List<UpdateDefinition<BsonDocument>>();
-
foreach (var element in bc.Elements)
-
{
-
var key = parent == null ? element.Name : $"{parent}.{element.Name}";
-
var subUpdates = new List<UpdateDefinition<BsonDocument>>();
-
//子元素是對象
-
if (element.Value.IsBsonDocument)
-
{
-
updates.AddRange(BuildUpdateDefinition(element.Value.ToBsonDocument(), key));
-
}
-
//子元素是對象數組
-
else if (element.Value.IsBsonArray)
-
{
-
var arrayDocs = element.Value.AsBsonArray;
-
var i = 0;
-
foreach (var doc in arrayDocs)
-
{
-
if (doc.IsBsonDocument)
-
{
-
updates.AddRange(BuildUpdateDefinition(doc.ToBsonDocument(), key + $".{i}"));
-
}
-
else
-
{
-
updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
-
continue;
-
}
-
i++;
-
}
-
}
-
//子元素是其他
-
else
-
{
-
updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
-
}
-
}
-
return updates;
-
}
注意其中key的構建,針對文檔包含的子文檔,需要對其key添加到根節點的路徑。針對包含文檔數組的,需要添加下標,指定到對應的標簽進行數據的更新。
調用更新操作,更新多份文檔操作如下:
-
/// <summary>更新</summary>
-
public async Task<IEnumerable<string>> UpdateAsync(MetadataCollection metadatas)
-
{
-
List< string> result = null;
-
var kmds = metadatas.Select(e => e.As<Metadata>()).ToList();
-
var docs = kmds.ConvertAll(DicConvertToBsonDoc);
-
var updateOptions = new UpdateOptions { IsUpsert = true };
-
try
-
{
-
foreach (var doc in docs)
-
{
-
var filter = Builders<BsonDocument>.Filter.Eq(f => f[iiid], doc[iiid]);
-
var update = Builders<BsonDocument>.Update.Combine(BuildUpdateDefinition(doc,null));
-
await _access.UpdateAsync(filter, update, updateOptions);
-
}
-
result = metadatas.Select(s => s.IIId).ToList();
-
}
-
catch (Exception ex)
-
{
-
IndexExceptionCodes.UpdatingIndexFailed.ThrowUserFriendly(ex.Message, "更新索引失敗");
-
}
-
return result;
-
}
其中,先將給定的模型列表轉化為Mongodb的文檔對象BsonDocument,然后執行更新操作。指定操作如果key不存在執行插入操作。
示例如下:
Step1:查看原文檔
Step2:執行更新操作
Step3:查看更新之后的結果
參考如下:
MongoDB更新包含對象數組的元素: 使用mongodb中數組元素的下標來做更新(update)多維數組 例如有如下數據結構: { "_id":ObjectId("4b97e62bf1d8c7152c9ccb74"), ”comments“:[ { "by":"joe", "votes":3, "replies":[ {"by":"jane", "votes":2 }] }] } 如果要將"replies"中{“by”:"jane"}的投票數增加1,該如何做呢?
mongodb使用多維數組下標的方式來定位某個元素
先find({"comments.replies.by":"jane"})來獲取到整個object, 然后計算相應reply的數組下標, 再使 用update({"comments.0.replies.0.by":"jane"},{"$inc", {"comments.0.replies.0.votes":1}})