Stiamo facendo un piccolo picco su Mongo DB per il nostro progetto C# .NET per vedere se è giusto per noi, e ho incontrato un piccolo problema con il driver mongodb-csharp di samus che non sono sicuro di come implementare.driver mongodb-csharp - come salvare una proprietà come riferimento anziché incorporata?
Dato il seguente modello semplificato:
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; }
}
Stiamo cercando di capire, come le osservazioni di cui sopra suggeriscono, come salvare sito come un tipo di riferimento, piuttosto che incorporato in Placement. Il sito è la sua raccolta di livello superiore che cambia indipendentemente da ogni campagna.
Idealmente, mi piacerebbe farlo usando il MongoConfigurationBuilder invece di dover modificare i miei POCO. Non riesco proprio a trovare alcuna documentazione su come questo sia stato realizzato.
speravo sarebbe facile come:
var config = new MongoConfigurationBuilder();
config.Mapping(mapping =>
{
//maybe some more configuration here?
mapping.Map<Site>();
mapping.Map<Campaign>();
});
ma questo è ancora l'incorporamento Siti quando uso il seguente codice:
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);
Questo ci sta dando:
{ "_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" }
Considerando che vogliamo qualcosa di più simile:
{ "_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" }
Non sono sicuro se questo è il documento esatto con cui ci saremmo trovati, ma hai capito il punto.
Mi sento come se mi mancasse qualcosa di ovvio, ma senza una migliore documentazione su questo aspetto dell'autista, sono una specie di ripresa al buio. Ho persino controllato i test nella fonte e non sono riuscito a capirlo.
Qualcuno sa come fare? È possibile?
Questo ha funzionato grazie - anche se, quello che potresti fare al posto di questo è solo usare un Oid. DBRef è piuttosto ingombrante e in questo caso tutto ciò che si sta utilizzando è ottenere l'ID in modo da poterlo ritirare. – mrdowns
I DBRefs non possono essere utilizzati nella pipeline di aggregazione e quindi doppio problema qui nel caso in cui tu stia percorrendo quella strada ..;) – ostati
Puoi fare un esempio su come fai un semplice filtro su un elenco di ref? Es: ~ var filter = Builders .Filter.In (c => c.Placements, listOfSiteIds); –
Misi