2011-03-02 48 views
3

鑑於以下類別和示例文檔,如何從Question集合中找到AnswerChoice文檔,其中AnswerChoice中的_id是使用官方C#驅動程序的「4d6d336ae0f84c23bc1fae00」。謝謝。如何使用MongoDB官方C#驅動程序檢索所有嵌入文檔值?

public class Question 
{ 
    [BsonId] 
    public ObjectId QuestionId 
    {get;set;} 

    public string Question 
    {get;set;} 

    public List<AnswerChoice> AnswerChoices 
    {get;set;} 
} 

public class AnswerChoice 
{ 
    [BsonId] 
    public ObjectId AnswerChoiceId 
    {get;set;} 

    public string Answer 
    {get;set;} 

    public int Order 
    {get;set;} 

} 

//樣品文件

{ 
    "_id": "4d6d3369e0f84c23bc1facf7", 
    "Question": "Question 1", 
    "AnswerChoices": [ 
    { 
     "_id": "4d6d3369e0f84c23bc1facf2", 
     "Answer": "Answer Choice A", 
     "Order": 1 
    }, 
    { 
     "_id": "4d6d3369e0f84c23bc1facf3", 
     "Answer": "Answer Choice B", 
     "Order": 2 
    }, 
    { 
     "_id": "4d6d3369e0f84c23bc1facf4", 
     "Answer": "Answer Choice C", 
     "Order": 3 
    }, 
    { 
     "_id": "4d6d3369e0f84c23bc1facf5", 
     "Answer": "Answer Choice D", 
     "Order": 4 
    }, 
    { 
     "_id": "4d6d3369e0f84c23bc1facf6", 
     "Answer": "Answer Choice E", 
     "Order": 5 
    } 
} 

//代碼檢索問題有AnswerChoice與_id 「4d6d336ae0f84c23bc1fae00」

List<Question> list = new List<Question>(); 
MongoServer _server = MongoServer.Create("mongodb://localhost"); 
MongoDatabase _database = _server.GetDatabase("test"); 
var query = Query.And(Query.EQ("AnswerChoices._id", new ObjectId("4d6d336ae0f84c23bc1fae00"))); 
MongoCollection<Question> collection = _database.GetCollection<Question>("Question"); 
MongoCursor<Question> cursor = collection.Find(query); 

foreach (var q in cursor) 
{ 
    list.Add(q); 
} 

//如何檢索AnswerChoice物體「4d6d336ae0f84c23bc1fae00」的_id

回答

4

您應該加載問題(如上面的代碼中所示)並使用linq或foreach來獲取具有指定_id的回答項目。所以,代碼將是這樣的:

List<Question> list = new List<Question>(); 
MongoServer _server = MongoServer.Create("mongodb://localhost"); 
MongoDatabase _database = _server.GetDatabase("test"); 
var query = Query.And(Query.EQ("AnswerChoices._id", new ObjectId("4d6d336ae0f84c23bc1fae00"))); 
MongoCollection<Question> collection = _database.GetCollection<Question>("Question"); 
MongoCursor<Question> cursor = collection.Find(query); 

var id = new ObjectId("4d6d336ae0f84c23bc1fae00"); 
foreach (var q in cursor) 
{ 
    var answerChoice = q.AnswerChoices.Single(x=> x.AnswerChoiceId == id); 
    list.Add(q); 
} 

此外,我建議,而不是尋找使用FindOne方法(因爲我想你肯定只有一個答案用上面指定_id存在)。

+0

有沒有辦法直接做到這一點,而不使用LINQ?我想你的方式可以與我需要的一起工作。我只是好奇。謝謝! – atbebtg 2011-03-02 18:55:22

+0

@atbebtg:通過回答使用foreach .. – 2011-03-02 19:42:51