2010-10-04 12 views
11

Bizim için doğru olup olmadığını görmek için C# .NET projemiz için Mongo DB üzerinde biraz başak yapıyoruz ve samus tarafından mongodb-csharp sürücüsü ile küçük bir sorunla karşılaşıyorum. uygulamaya.mongodb-csharp sürücüsü - bir özelliği gömülü yerine referans olarak nasıl kaydederim?

Verilen aşağıdaki basitleştirilmiş modeli:

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

comments yukarıda önerdiği gibi biz anlamaya çalışıyoruz, bir referans yerine türe Yerleştirme gömülü olarak Siteyi nasıl kaydedileceği. Site, her Kampanyadan bağımsız olarak değişen kendi üst düzey koleksiyonudur.

İdeal olarak, benim Poços değiştirmek zorunda yerine MongoConfigurationBuilder kullanarak bunu yapmak istiyorum. Bunun nasıl yapıldığına dair herhangi bir belge bulamıyorum.

Ben kadar kolay olacağını umuyordum:

var config = new MongoConfigurationBuilder(); 

config.Mapping(mapping => 
{ 
    //maybe some more configuration here? 
    mapping.Map<Site>(); 
    mapping.Map<Campaign>(); 
}); 

Ama şu kodu kullandığınızda hala Siteleri gömme ediyor:

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

Bu bizi veriyor:

{ "_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" } 

Halen daha çok bir şey istiyoruz:

{ "_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" } 

Bunu biz ile bitirmek istiyorum kesin belge olmadığından emin değilim, ama noktası olsun. Ben belirgin bir şey eksik sanki

hissediyorum ama sürücünün bu yönü üzerinde daha iyi belgeler olmadan, bir nevi karanlıkta çekiyorum. Hatta testlerdeki kaynaklara baktım ve anlayamadım.

kimse bunun nasıl yapılacağını biliyor mu? Mümkün mü? Eğer DBRef kullanmak zorunda Bu amaçla

cevap

9

.

C# Bunu yapmak için, bu

public class Campaign 
{   
    public string Name { get; set; } 
    public List<DBRef> Placements { get; set; } 
} 

gibi kampanya sınıfını değiştirmek Ve kod test etmedim bu

List<DBRef> refList = new List<DBRef>() {firstSite,secondSite }; 


var firstCampaign = new Campaign 
{ 
    Name = "first campaign", 
    Placements = refList 
}; 

campaignCollection.Save(firstCampaign); 

gibi referans belgesi eklemek zorunda, ama bu Bunu nasıl başaracağınıza dair ipucu verir.

+3

Bu işe yaradı - teşekkürler, bunun yerine bunun yerine yapabileceğiniz şey sadece bir Oid kullanıyor. DBRef oldukça hantaldır ve bu durumda kullandığınız tek şey kimliği almaktır, böylece siteyi geri çekebilirsiniz. – mrdowns

+0

DBRef'ler, toplama yolunda kullanılamaz, bu nedenle bu rotaya giderseniz iki kat sorun yaşarsınız.;) – ostati

+0

Refs listesinde basit bir filtreyi nasıl yaptığınıza dair bir örnek verebilir misiniz? Ör .: ~ var filtre = Yapıcılar .Filter.In (c => c.Placements, listOfSiteIds); – Misi

İlgili konular