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