3

鉴于以下类和示例文档,如何使用官方 C# 驱动程序从 Question 集合中检索 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;}

}

// 示例文档

{
  "_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
    }
}

//检索具有“4d6d336ae0f84c23bc1fae00”_id 的 AnswerChoice 的问题的代码

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

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

4

2 回答 2

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 方法代替 Find (因为我想您确定只有一个具有上述指定 _id 的答案存在)。

于 2011-03-02T18:50:32.970 回答
4

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

于 2011-03-02T18:54:53.713 回答