2015-01-02 1 views
2

Я пытаюсь получить дочерний элемент из моего документа с помощью коннектора C#.Получить дочерний элемент из документа

Мой документ выглядит следующим образом:

// sample document 
{ 
    "_id": 
    { 
     "$oid":"myid" 
    }, 
    "Somedata":"This is a test", 
    "object1": 
    { 
     "name":"myname", 
     "object2": 
     { 
     "Text":"Hello World!" 
     } 
    } 
} 

У меня есть класс, который отображает на это, что выглядит примерно так:

[BsonIgnoreExtraElements] 
public class MyDataClass 
{ 
    [BsonId] 
    public ObjectId Id { get; set; } 
    [BsonElement("object1.object2.Text")] 
    public string Text; 
    [BsonElement("Somedata")] 
    public string Data; 
} 

Когда запрос выполняется, идентификатор и Переменные данных заполнены, но переменная текста - нет. Я предполагаю, что это потому, что он находится внутри объекта, но я не уверен, где я ошибаюсь.

+0

Я считаю, ваш _id находится в неправильном формате, вы уверены, что _id { "$ oid": "myid" } – Disposer

+0

Когда mongodb возвращает документ, он возвращает весь документ. В SQL нет конкретного выбора имени столбца, как мы можем. Поэтому вам нужно выполнить итерацию через Object1, чтобы получить текстовое поле. Я считаю, что драйвер mongodb не сделает это за вас – qamar

+0

В отличие от сайтов на форуме, мы не используем «Спасибо», «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -Удалена-от-сообщений). –

ответ

2

BsonElement принимает параметр как имя для корневого уровня названия поля, такие как «field1», и вы не можете передать вложенное имя (с помощью точечной нотации имен, таких как «field1.nested_field»). Вы должны определить некоторые классы для вспомогательных документов

public class MyDataClass 
{ 
    public ObjectId _id { get; set; } 
    public string Somedata { get; set; } 
    public Object1 object1 { get; set; } 
} 

public class Object1 
{ 
    public string name { get; set; } 
    public Object2 object2 { get; set; } 
} 

public class Object2 
{ 
    public string Text { get; set; } 
} 

И если не хотите, чтобы определить новые классы для поддокументов, вы должны написать свое собственное Монго Serializer и DeSerializer для MyDataClass