2011-12-28 160 views
4

我在SSIS中創建了一個腳本來從MongoDB中檢索數據。雖然我沒有任何問題查詢常規文檔,但我不確定如何從嵌套文檔檢索值。例如,展開的「地址」包含「國家」,「州」,「城市」,「街道」和「郵編」。我只想檢索「國家」(字段)值。理論上,我知道它應該像「Address.Country」,但我不知道如何在代碼中實現它。什麼是實現這一目標的最佳方式?從MongoDB查詢嵌套對象

這是檢索所有其他文件的代碼:

public override void CreateNewOutputRows() 
    { 
     string connectionString = "mongodb://localhost"; 
     MongoServer myMongo = MongoServer.Create(connectionString); 
     myMongo.Connect(); 
     var db = myMongo.GetDatabase("UserDB"); 
     /*ICursor<BsonDocument> cursor = db.GetCollection<BsonDocument>("UserDB").FindAll();*/ 
     foreach (BsonDocument document in db.GetCollection<BsonDocument>("UserDB").FindAll()) 
     { 
      this.UserDBBuffer.AddRow(); 
      this.UserDBBuffer.ID = document["_id"] == null ? "" : document["_id"].ToString(); 

      this.UserDBBuffer.PrimaryEmail = document["primary_email"] == null ? "" : document["primary_email"].ToString(); 
      this.UserDBBuffer.Gender = document["gender"] == null ? "" : document["gender"].ToString(); 

     } 
} 

回答

0
db.users.find({_id: user_id}, 
       {'address.country': 1}); 

這將使用光標SetFields讓你在C#一樣

{"_id": ObjectId('4efb78234ee9184d8b5a4e92'), 
"address": {"country": "Russia"}} 
5

文檔可以做到這一點由FindAll返回:

var fields = Fields.Include("Address.Country"); 
foreach (var document in collection.FindAll().SetFields(fields)) 
{ 
    Console.WriteLine(document.ToJson()); 
} 

您可以使用以下方式從返回的文檔中提取國家/地區值:

var country = document["Address"].AsBsonDocument["Country"].AsString; 
+0

謝謝!這正是我需要的! – Pasha 2012-01-04 04:37:48

+0

現在,下一個挑戰是如何從數組中提取數據。例如,其中一個陣列如下所示:「devices - > Document - > device_data - > model」或「devices - > Document - > device_data - > brand」。我如何提取設備的型號或品牌? 再次感謝您的幫助! – Pasha 2012-01-04 04:40:36

+0

我將「地址」更改爲「位置」(另一個字段包含國家/地區),我的腳本返回「國家/地區未找到」,我找不到原因...... – Pasha 2012-01-04 05:34:29