You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:27:02