3

次のクラスとサンプルドキュメントがある場合、公式のC#ドライバーを使用して、AnswerChoiceの_idが「4d6d336ae0f84c23bc1fae00」であるQuestionコレクションからAnswerChoiceドキュメントを取得するにはどうすればよいですか。ありがとうございました。

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

//「4d6d336ae0f84c23bc1fae00」の_idを持つAnswerChoiceオブジェクトを取得するにはどうすればよいですか?????

4

2 に答える 2

4

ドキュメント全体ではなく、サブドキュメントのみが必要なようです。これは現在、Mongodbではサポートされていません。一致すると、ドキュメント全体が返されます。クエリは、MongoDBの埋め込みドキュメントのフィルタリングに似ています。この機能リクエストにはオープンなJIRAアイテムがあり、http://jira.mongodb.org/browse/SERVER-828に投票する必要があります。

于 2011-03-02T18:54:53.713 に答える
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);
}

また、Findの代わりにFindOneメソッドを使用することをお勧めします(上記で指定された_idを持つ回答が1つだけ存在することを確認しているため)。

于 2011-03-02T18:50:32.970 に答える