如何使用MongoDB的官方C#驱动程序检索所有嵌入的文档值?

鉴于以下类和示例文档,如何从Question集合中检索AnswerChoice文档,其中AnswerChoice中的_id是’4d6d336ae0f84c23bc1fae00’使用官方C#驱动程序。 谢谢。

public class Question { [BsonId] public ObjectId QuestionId {get;set;} public string Question {get;set;} public List 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 list = new List(); MongoServer _server = MongoServer.Create("mongodb://localhost"); MongoDatabase _database = _server.GetDatabase("test"); var query = Query.And(Query.EQ("AnswerChoices._id", new ObjectId("4d6d336ae0f84c23bc1fae00"))); MongoCollection collection = _database.GetCollection("Question"); MongoCursor cursor = collection.Find(query); foreach (var q in cursor) { list.Add(q); } 

//如何使用_id为“4d6d336ae0f84c23bc1fae00”检索AnswerChoice对象?????

您应该加载问题(如上面的代码中所示)并使用linq或foreach来获取具有指定_id的答案项。 所以代码看起来像:

 List list = new List(); MongoServer _server = MongoServer.Create("mongodb://localhost"); MongoDatabase _database = _server.GetDatabase("test"); var query = Query.And(Query.EQ("AnswerChoices._id", new ObjectId("4d6d336ae0f84c23bc1fae00"))); MongoCollection collection = _database.GetCollection("Question"); MongoCursor 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方法代替Find(因为我认为你确定只有一个答案与上面指定的_id存在)。

看起来您只需要子文档而不是整个文档。 Mongodb目前不支持此function。 在匹配时,将返回整个文档。 您的查询类似于在MongoDB中过滤嵌入式文档 。 此function请求有一个开放的JIRA项目,您应该在http://jira.mongodb.org/browse/SERVER-828上投票