在mongodb c#中将一个集合的所有嵌套数组加入一个数组中

时间:2017-12-07 18:06:43

标签: c# arrays mongodb

我有这种结构的文件:

    { 
        "_id" : ObjectId("5a26f1764cacd91bf4624a76"), 
        "CompetitorIds" : [
            "3a11f1764cacd91bf4624b84",
            "2a26f1764cacd91bf4624a55"
        ],
        "BusinessId" : "5a1bfcac2b8fb6096885cbb8"
    }

我希望获得一个包含所有竞争对手的独特阵列,例如,如果我有这些文件:

    { 
        "_id" : ObjectId("5a26f1764cacd91bf4624a76"), 
        "CompetitorIds" : [
            "111111111111111111111111",
            "222222222222222222222222"
        ], 
        "BusinessId" : "5a1bfcac2b8fb6096885cbb8"
    }
    { 
        "_id" : ObjectId("7a26f1764cacd91bf4112a88"), 
        "CompetitorIds" : [
            "333333333333333333333333",
            "444444444444444444444444"
        ], 
        "BusinessId" : "5a1bfcac2b8fb6096885cbb8"
    }

我想要一个像:

这样的数组
["111111111111111111111111","222222222222222222222222","333333333333333333333333","444444444444444444444444"]

现在,我是这样做的,使用MongoDB.Driver到C#:

public class Product
{
    public ObjectId Id { get; set; }
    public string[] CompetitorIds { get; set; }
    public string BusinessId { get; set; }
}

public List<string> GetAllCompetitors(string businessId)
{            
    var builder = Builders<Product>.Filter;
    var filter = builder.Eq(p => p.BusinessId, businessId) & builder.Where(p => p.CompetitorIds.Length > 0);
    var collection = _collection.Find(filter);
    var productIdsAlreadyBound = collection.ToList().SelectMany(x => x.CompetitorIds).ToList();
}

但我想知道是否有更好的方法可以做到这一点。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

编辑:虽然以下是@ Veeram在评论中的解决方案,但更优雅。

以下是如何做到这一点:

首先,在(必需的)$unwind阶段之后定义一个表示文档结构的类型。这种类型只会使C#客户端更好地处理,因此您可以编写类型代码而不是摆弄string s。

public class ProductAfterUnwind
{
    public string CompetitorIds { get; set; }
}

然后你可以这样做:

var productIdsAlreadyBound = _collection
    .Aggregate()
    .Match(p => p.BusinessId == "5a1bfcac2b8fb6096885cbb8")
    .Unwind<Product, ProductAfterUnwind>(p => p.CompetitorIds)
    .Group(p => string.Empty, grouping => new
    {
        CompetitorIds = grouping.Select(p => p.CompetitorIds).Distinct()
    })
    .FirstOrDefault();