Как получить все встроенные значения документа, используя официальный драйвер C # для MongoDB? - PullRequest
3 голосов
/ 02 марта 2011

Учитывая следующие классы и пример документа, Как получить документ AnswerChoice из коллекции Вопросов, где _id в AnswerChoice '4d6d336ae0f84c23bc1fae00' с использованием официального драйвера 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 с _id "4d6d336ae0f84c23bc1fae00" ?????

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Похоже, вам нужен только поддокумент, а не весь документ.В настоящее время это не поддерживается в Mongodb.При совпадении весь документ возвращается.Ваш запрос похож на Фильтрация встроенных документов в MongoDB .Для этого запроса функции есть открытый элемент JIRA, за который вы должны проголосовать http://jira.mongodb.org/browse/SERVER-828

4 голосов
/ 02 марта 2011

Вы должны загрузить вопрос (как в коде выше) и использовать 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).

...