使用C#从MongoDB数组中查询AttributeName为Owner的去重AttributeValue
问题根源
你现有代码的逻辑只筛选了「包含Owner属性的文档」,没有过滤数组内的非Owner元素,直接对整个数组的AttributeValue去重自然会返回所有属性的值。
正确实现方案
需要使用MongoDB聚合管道完成,先拆分数组、过滤Owner属性再去重,代码如下:
var distinctItems = _projectArtifacts.Aggregate() // 拆分ArtifactAttributes数组为单元素 .Unwind(x => x.ArtifactAttributes) // 仅保留AttributeName为Owner的元素 .Match(Builders<Documents>.Filter.Eq("ArtifactAttributes.AttributeName", "Owner")) // 按AttributeValue分组实现去重 .Group("{ _id: '$ArtifactAttributes.AttributeValue' }") // 提取去重后的值 .Project("{ _id: 0, Value: '$_id' }") .ToList() .Select(x => x["Value"].AsString) .ToList();
如果你偏好强类型语法,可使用如下写法:
// 定义接收分组结果的类 public class OwnerGroupResult { public string Value { get; set; } } var distinctItems = _projectArtifacts.Aggregate() .Unwind(x => x.ArtifactAttributes) .Match(x => x.ArtifactAttributes[-1].AttributeName == "Owner") .Group( x => x.ArtifactAttributes[-1].AttributeValue, g => new OwnerGroupResult { Value = g.Key } ) .ToList() .Select(x => x.Value) .ToList();
注:代码中的
[-1]是MongoDB C#驱动针对Unwind后数组元素的专属强类型访问语法,运行时会自动识别为当前展开的数组元素,不会抛出索引越界异常。
内容的提问来源于stack exchange,提问作者Manoj Naik
相关产品推荐
相关产品推荐

