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)}”
),这会稍微改善这里的情况。