我有这种结构的文件:
{
"_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();
}
但我想知道是否有更好的方法可以做到这一点。有什么建议吗?
答案 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();