MongoDB C#2.4-查找嵌套数组的不同值

MongoDB C#2.4-查找嵌套数组的不同值,c#,mongodb,C#,Mongodb,我的文档如下所示: { "_id" : ObjectId("58148f4337b1fc09b8c2de9k"), "Price" : 69.99, "Attributes" : [ { "Name" : "Color", "Value" : "Grey", }, { "Name" : "Gender", "Value" : "

我的文档如下所示:

{
    "_id" : ObjectId("58148f4337b1fc09b8c2de9k"),
    "Price" : 69.99,
    "Attributes" : [ 
        {
            "Name" : "Color",
            "Value" : "Grey",
        },
        {
            "Name" : "Gender",
            "Value" : "Mens",
        }
    ]
}
我希望得到Attributes.Name的一个不同列表(因此,如果我只有上面提到的一个文档,我会得到'Color'和'Gender'返回)

我可以通过MongoShell(db.getCollection('myCollection').distinct('Attributes.Name')轻松获得所需的内容,但我确实很难使用C#驱动程序(版本2.4)。有人能帮我将shell命令翻译成C#吗

我尝试了以下类似的方法(以及许多变体)。我对Mongo C#driver还不熟悉,只是觉得有点迷茫。如有任何帮助,将不胜感激

var database = client.GetDatabase("mymongodb");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("mycollection");
var filter = new BsonDocument();
var distinctAttributeNames = collection.Distinct<BsonDocument>("Attributes.Name", filter);
var tryAgain = collection.Distinct<BsonDocument>("{Attributes.Name}", filter);
var-database=client.GetDatabase(“mymongodb”);
IMongoCollection=database.GetCollection(“mycollection”);
var filter=新的BsonDocument();
var distinctAttributeNames=collection.Distinct(“Attributes.Name”,filter);
var tryAgain=collection.Distinct(“{Attributes.Name}”,filter);
好了:

public class Foo
{
    public ObjectId Id;
    public double Price = 69.99;
    public Attribute[] Attributes = {
        new Attribute { Name = "Color", Value = "Grey" },
        new Attribute { Name = "Gender", Value = "Men" }
    };
}

public class Attribute
{
    public string Name;
    public string Value;
}

public class Program
{
    static void Main(string[] args)
    {
        MongoClient client = new MongoClient();
        var collection = client.GetDatabase("test").GetCollection<Foo>("test");
        collection.InsertOne(new Foo());
        var distinctItems = collection.Distinct(new StringFieldDefinition<Foo, string>("Attributes.Name"), FilterDefinition<Foo>.Empty).ToList();
        foreach (var distinctItem in distinctItems)
        {
            Console.WriteLine(distinctItem);
            // prints:
            // Color
            // Gender
        }
        Console.ReadLine();
    }
}
公共类Foo
{
公共对象Id;
公开双价=69.99;
公共属性[]属性={
新属性{Name=“Color”,Value=“Grey”},
新属性{Name=“Gender”,Value=“Men”}
};
}
公共类属性
{
公共字符串名称;
公共字符串值;
}
公共课程
{
静态void Main(字符串[]参数)
{
MongoClient=新的MongoClient();
var collection=client.GetDatabase(“test”).GetCollection(“test”);
collection.InsertOne(新的Foo());
var differentitems=collection.Distinct(新的StringFieldDefinition(“Attributes.Name”)、FilterDefinition.Empty.ToList();
foreach(var Differentitem in Differentitems)
{
控制台写入线(TEM);
//印刷品:
//颜色
//性别
}
Console.ReadLine();
}
}
好了:

public class Foo
{
    public ObjectId Id;
    public double Price = 69.99;
    public Attribute[] Attributes = {
        new Attribute { Name = "Color", Value = "Grey" },
        new Attribute { Name = "Gender", Value = "Men" }
    };
}

public class Attribute
{
    public string Name;
    public string Value;
}

public class Program
{
    static void Main(string[] args)
    {
        MongoClient client = new MongoClient();
        var collection = client.GetDatabase("test").GetCollection<Foo>("test");
        collection.InsertOne(new Foo());
        var distinctItems = collection.Distinct(new StringFieldDefinition<Foo, string>("Attributes.Name"), FilterDefinition<Foo>.Empty).ToList();
        foreach (var distinctItem in distinctItems)
        {
            Console.WriteLine(distinctItem);
            // prints:
            // Color
            // Gender
        }
        Console.ReadLine();
    }
}
公共类Foo
{
公共对象Id;
公开双价=69.99;
公共属性[]属性={
新属性{Name=“Color”,Value=“Grey”},
新属性{Name=“Gender”,Value=“Men”}
};
}
公共类属性
{
公共字符串名称;
公共字符串值;
}
公共课程
{
静态void Main(字符串[]参数)
{
MongoClient=新的MongoClient();
var collection=client.GetDatabase(“test”).GetCollection(“test”);
collection.InsertOne(新的Foo());
var differentitems=collection.Distinct(新的StringFieldDefinition(“Attributes.Name”)、FilterDefinition.Empty.ToList();
foreach(var Differentitem in Differentitems)
{
控制台写入线(TEM);
//印刷品:
//颜色
//性别
}
Console.ReadLine();
}
}

当您运行上述代码时会发生什么?检查以确保您拥有正确的集合/db名称当您运行上述代码时会发生什么?检查以确保您拥有正确的集合/db名称谢谢您提供了这样一个完整的示例。我真是太笨了……我已经让它工作了,但我没有意识到我得到了预期的结果,我只是我从Mongo驱动程序(我忘了在我的问题中提到)得到一个InvalidoOperation异常。我认为异常(只是在结果中捕获,没有抛出)是由于使用同步方法而没有调用“ToList()”。我最终使用了var distinctAttributeNames=collection.Distinct(新的StringFieldDefinition(“Attributes.Name”)、new-BsonDocument()).ToList();有没有办法获得“Attributes.Name”强类型?例如:new-StringFieldDefinition(x=>x.Attributes.Name)?@Bassebus:我想没有。不过,你可以做的是使用
nameof()
和一些字符串的微调(如
$“{nameof(Foo.Attributes)}。{nameof(Attribute.Name)}“
)这稍微改进了一点。谢谢你提供了这样一个完整的示例。虽然我很愚蠢……我让它工作了,但我没有意识到我得到了预期的返回结果,我只看到了一个来自Mongo驱动程序的InvalidoOperation异常(我忘了在问题中提到)。我认为异常(只是在结果中捕获,没有抛出)是由于使用了同步方法而没有调用“ToList()”。我最终使用了var distinctAttributeNames=collection.Distinct(新的StringFieldDefinition(“Attributes.Name”)、新的BsonDocument()).ToList();有办法获取“Attributes.Name”吗“强类型?例如:新的StringFieldDefinition(x=>x.Attributes.Name)?@Bassebus:我认为没有。不过,您可以做的是使用
nameof()
,并稍微修改字符串(如
$“{nameof(Foo.Attributes)}.{nameof(Attribute.Name)}”
),这会稍微改善这里的情况。