2017-06-15 24 views
0

我有一個類似於下面的文件嵌套數組的不同值:MongoDB的C#2.4 - 查找

{ 
    "_id" : ObjectId("58148f4337b1fc09b8c2de9k"), 
    "Price" : 69.99, 
    "Attributes" : [ 
     { 
      "Name" : "Color", 
      "Value" : "Grey", 
     }, 
     { 
      "Name" : "Gender", 
      "Value" : "Mens", 
     } 
    ] 
} 

我希望得到Attributes.Name(所以如果我有一個文檔的不同列表上面,我會得到'顏色'和'性別'返回)。我可以通過mongo shell(db.getCollection('myCollection')。distinct('Attributes.Name')輕鬆獲得我需要的東西,但是我真的很苦惱C#驅動程序(版本2.4)。有人可以幫我把shell命令翻譯成C#嗎?

我試過類似下面(和很多變化)。我是新來的Mongo C#驅動程序,我只是覺得有點失落,任何幫助,將不勝感激。

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); 
+0

當你運行上面的代碼時會發生什麼?檢查以確保你有正確的收集/分辨名稱 – Veeram

回答

0

你去那裏:

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(); 
    } 
} 
+0

謝謝你這樣一個完整的例子。儘管我愚蠢....我有它的工作,但我沒有意識到我得到了預期的結果返回,我只看到一個InvalidOperation異常,我從Mongo驅動程序(我忘了在我的問題中提到)獲得。我認爲這個異常(剛纔在結果中被捕獲,而不是拋出)是由於使用同步方法而不是調用'ToList()'。我最終使用var distinctAttributeNames = collection.Distinct(new StringFieldDefinition (「Attributes.Name」),new BsonDocument())。ToList(); –