使用MongoDB C# Driver过滤嵌套对象数组字段实现去重新增
MongoDB C# 驱动嵌套数组去重插入过滤实现方案
需求背景
需要对包含嵌套对象数组的MongoDB文档做插入校验:仅当待新增对象的ObjectId不存在于ObjectArray数组中时,才将该对象插入数组,要求通过单条过滤规则实现该逻辑。
现有文档结构
{ "_id": { "$oid": "614ba49b46727413d60b99e2" }, "Name": 1, "ObjectArray": [ { "ObjectId": { "$oid": "614ba49b46727413d60b99e3" }, "Value": "some value", }, { "ObjectId": { "$oid": "614ba49b46727413d60b99e5" }, "Value": "other value", } ], }
错误实现与问题
之前尝试使用位置运算符[-1]配合Nin做校验,但是只能校验数组第一个元素的ObjectId,无法遍历全数组:
var filter = FilterBuilder.Eq(x => x.Id, id) & FilterBuilder.Nin(x => x.ObjectArray[-1].ObjectId, new[] { newDoc.ObjectId});
正确实现方案
组合ElemMatch与Not运算符即可实现全量数组校验,过滤规则写法如下:
var filter = FilterBuilder.Eq(x => x.Id, id) & FilterBuilder.Not(FilterBuilder.ElemMatch(x => x.ObjectArray, Builders<ObjectClass>.Filter.Eq(y => y.ObjectId, newDoc.ObjectId)));
说明:该规则会先匹配指定_id的父文档,再校验ObjectArray数组中不存在任何ObjectId与待插入对象相等的元素,两个条件同时满足时才会触发后续插入操作,天然支持原子性的去重插入,不需要额外的多查询校验逻辑。
内容的提问来源于stack exchange,提问作者SchwarzePete
相关产品推荐
相关产品推荐

