Как добавить список документов в качестве элемента документа? - PullRequest
0 голосов
/ 25 января 2011

Как мне создать следующий документ, используя официальный драйвер c #?

{
    "name": "John Doe",
    "classess": [
        {
            "classname": "Class1"
        }
        {
            "classname": "Class2"
        }
    ]
}

приведенный ниже код не работает

string cs = "mongodb://localhost";
MongoServer server = MongoServer.Create(cs);
MongoDatabase test = server.GetDatabase("test");

MongoCollection<BsonDocument> students = test.GetCollection("students");

BsonDocument doc = new BsonDocument();
doc.Add(new BsonElement("name", "John doe"));

//Create the list
List<BsonDocument> classes = new List<BsonDocument>();
classes.Add(new BsonDocument(new BsonElement("classname","Test1")));
classes.Add(new BsonDocument(new BsonElement("classname","Test2")));

следующая строка выдаст ошибку по понятной причине. Как правильно это сделать?

doc.Add(new BsonElement("classess",classes));
students.Insert(doc);

Спасибо.

Ответы [ 2 ]

7 голосов
/ 04 февраля 2011

Чтобы создать этот документ, используя только классы BsonDocument, я написал бы:

        var document = new BsonDocument {
            { "name", "John Doe" },
            { "classes", new BsonArray {
                new BsonDocument("classname", "Class1"),
                new BsonDocument("classname", "Class2")
            }}
        };
        var json = document.ToJson();

В этом примере используется синтаксис инициализатора коллекции C #.

Последняя строка только для отладки. Вы можете посмотреть на переменную json и посмотреть, получили ли вы нужный результат.

1 голос
/ 25 января 2011

Предположим, у вас есть следующие классы:

public class NestedClass
{
  public string ClassName {get;set;}
}

public class Person
{
  public Person()
  {
    Classes = new List<NestedClass>();
  }  

  [BsonId]
  public string PersonId {get;set;}

  public string Name {get;set;}

  public List<NestedClass> Classes {get;set;}
}

Вам необходимо:

Создать создать и инициализировать экземпляр класса, который вы хотите сохранить

 var person = new Person(){PersonId = Guid.NewGuid().ToString(), Name = "Some name"};
 person.Classes.Add(new NestedClass(){ ClassName="classname1"})
 person.Classes.Add(new NestedClass(){ ClassName="classname2"})

чем

var server = MongoServer.Create("mongodb://localhost:27020");
  MongoDatabase test = server.GetDatabase("test");
  MongoCollection students = test.GetCollection<Person>("students");
  students.Insert(person.ToBsonDocument()); // it will automatically serialize and insert person

Также убедитесь, что вы запустили mongodb.

...