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

如何使用MongoDB的官方C#驱动程序检索所有嵌入的文档值?,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,给定以下类和示例文档,如何使用官方C驱动程序从问题集合中检索AnswerChoice文档,其中AnswerChoice中的id为“4d6d336ae0f84c23bc1fae00”。多谢各位 public class Question { [BsonId] public ObjectId QuestionId {get;set;} public string Question {get;set;} public List<An

给定以下类和示例文档,如何使用官方C驱动程序从问题集合中检索AnswerChoice文档,其中AnswerChoice中的id为“4d6d336ae0f84c23bc1fae00”。多谢各位

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;}

}
//用于检索答案选项为“4d6d336ae0f84c23bc1fae00”的问题的代码

List List=新列表();
MongoServer _server=MongoServer.Create(“mongodb://localhost");
MongoDatabase_database=_server.GetDatabase(“测试”);
var query=query.And(query.EQ(“AnswerChoices.\u id”,新ObjectId(“4d6d336ae0f84c23bc1fae00”));
MongoCollection集合=_database.GetCollection(“问题”);
MongoCursor=collection.Find(查询);
foreach(游标中的变量q)
{
列表。添加(q);
}
//如何检索id为“4d6d336ae0f84c23bc1fae00”的AnswerChoice对象?

您应该加载问题(如上面的代码所示),并使用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);
}
List List=新列表();
MongoServer _server=MongoServer.Create(“mongodb://localhost");
MongoDatabase_database=_server.GetDatabase(“测试”);
var query=query.And(query.EQ(“AnswerChoices.\u id”,新ObjectId(“4d6d336ae0f84c23bc1fae00”));
MongoCollection集合=_database.GetCollection(“问题”);
MongoCursor=collection.Find(查询);
变量id=新对象id(“4d6d336ae0f84c23bc1fae00”);
foreach(游标中的变量q)
{
var answerChoice=q.AnswerChoices.Single(x=>x.AnswerChoiceId==id);
列表。添加(q);
}

另外,我建议不要使用FindOne方法而使用FindOne方法(因为我假设您确定只有一个具有上述指定_id的答案存在)。

看起来您只需要子文档而不是整个文档。这在Mongodb中目前不受支持。匹配时,将返回整个文档。您的查询类似于。
此功能请求有一个打开的JIRA项目,您应该对此项目进行投票

有没有一种方法可以直接完成此操作而不使用linq?我想你的方法能满足我的需要。我只是好奇。非常感谢。
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);
}
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);
}