Мы делаем небольшой всплеск Mongo DB для нашего проекта C # .NET, чтобы увидеть, подходит ли он нам, и я столкнулся с небольшой проблемой с драйвером mongodb-csharp от Samus, который я не уверен, как реализовать.
Учитывая следующую упрощенную модель:
public class Campaign
{
public string Name { get; set; }
public IEnumerable<Placement> Placements { get; set; }
}
public class Placement
{
public string Name { get; set; }
//this should be a reference rather than included in the collection
public Site Site { get; set; }
}
//this should be its own collection, and not embedded anywhere
public class Site
{
public string Name { get; set; }
}
Мы пытаемся выяснить, как следует из приведенных выше комментариев, как сохранить Site как ссылочный тип, а не как встроенный в Placement. Сайт - это собственная коллекция верхнего уровня, которая изменяется независимо от каждой кампании.
В идеале я бы хотел сделать это с помощью MongoConfigurationBuilder, а не изменять свои POCO. Я просто не могу найти никакой документации о том, как это делается.
Я надеялся, что это будет так же просто, как:
var config = new MongoConfigurationBuilder();
config.Mapping(mapping =>
{
//maybe some more configuration here?
mapping.Map<Site>();
mapping.Map<Campaign>();
});
Но это все еще встраивание сайтов, когда я использую следующий код:
var db = mongo.GetDatabase("foo");
var campaignCollection = db.GetCollection<Campaign>();
var siteCollection = db.GetCollection<Site>();
var firstSite = new Site{Name = "first site"};
var secondSite = new Site{Name = "second site"};
var firstCampaign = new Campaign
{
Name = "first campaign",
Placements = new List<Placement>
{
new Placement{Name = "first placement", Site = firstSite},
new Placement{Name = "second placement", Site = secondSite}
}
};
siteCollection.Save(firstSite);
siteCollection.Save(secondSite);
campaignCollection.Save(firstCampaign);
Это дает us:
{ "_id" : ObjectId("4ca9f1db54730000000010cb"),
"Name" : "first campaign",
"Placements" : [
{
"Name" : "first placement",
"Site" : { "Name" : "first site" }
},
{
"Name" : "second placement",
"Site" : { "Name" : "second site" }
}
]}
{ "_id" : ObjectId("4ca9f1db54730000000010c9"), "Name" : "first site" }
{ "_id" : ObjectId("4ca9f1db54730000000010ca"), "Name" : "second site" }
В то время как мы хотим что-то большее, например:
{ "_id" : ObjectId("4ca9f1db54730000000010cb"),
"Name" : "first campaign",
"Placements" : [
{
"Name" : "first placement",
"Site" : ObjectId("4ca9f1db54730000000010c9")
},
{
"Name" : "second placement",
"Site" : ObjectId("4ca9f1db54730000000010ca")
}
]}
{ "_id" : ObjectId("4ca9f1db54730000000010c9"), "Name" : "first site" }
{ "_id" : ObjectId("4ca9f1db54730000000010ca"), "Name" : "second site" }
Я не уверен, что это именно тот документ, который у нас получился, но вы поняли суть.
Мне кажется, что я что-то упускаю очевидно, но без лучшей документации по этому аспекту драйвера я как бы снимаю в темноте. Я даже просмотрел тесты в источнике и не смог разобраться.
Кто-нибудь знает, как это сделать? Возможно ли это?