Wir machen einen kleinen Spike auf Mongo DB für unser C# .NET-Projekt, um zu sehen, ob es für uns richtig ist, und ich habe ein kleines Problem mit dem mongodb-csharp-Treiber von Samus, dass ich nicht sicher bin, wie implementieren.mongodb-csharp-Treiber - So speichern Sie eine Eigenschaft als Referenz und nicht als eingebettet?
Angesichts der folgenden vereinfachten Modell:
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; }
}
Wir versuchen, herauszufinden, wie die obigen Ausführungen legen nahe, wie der Website als referenzierte Typ zu speichern, anstatt in Placement eingebettet. Site ist eine eigene Sammlung auf oberster Ebene, die sich unabhängig von jeder Kampagne ändert.
Im Idealfall möchte ich dies mit dem MongoConfigurationBuilder tun, anstatt meine POCOs zu ändern. Ich kann einfach keine Dokumentation darüber finden, wie dies erreicht wird.
Ich hatte gehofft, es wäre so einfach wie:
var config = new MongoConfigurationBuilder();
config.Mapping(mapping =>
{
//maybe some more configuration here?
mapping.Map<Site>();
mapping.Map<Campaign>();
});
Aber das ist immer noch Seiten einbetten, wenn ich den folgenden Code verwenden:
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);
Dies wird uns geben:
{ "_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" }
Während wir wollen etwas mehr wie:
{ "_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" }
Ich bin mir nicht sicher, ob das das genaue Dokument ist, mit dem wir enden würden, aber Sie bekommen den Punkt.
Ich habe das Gefühl, dass ich etwas Offensichtliches vermisse, aber ohne eine bessere Dokumentation über diesen Aspekt des Fahrers, fotografiere ich im Dunkeln. Ich habe sogar die Tests in der Quelle durchgesehen und konnte es nicht herausfinden.
Weiß jemand, wie man das macht? Ist es möglich?
Dies funktionierte dank - obwohl, was Sie stattdessen tun könnten, ist nur ein Oid verwenden. DBRef ist ziemlich sperrig, und alles, was Sie dafür in diesem Fall verwenden, ist, die ID zu bekommen, damit Sie die Seite zurückziehen können. – mrdowns
DBRefs können nicht auch in der Aggregationspipeline verwendet werden, also doppelte Probleme hier, falls Sie diese Route gehen ..;) – ostati
Können Sie ein Beispiel geben, wie Sie einen einfachen Filter auf einer Liste von Referenzen erstellen? Beispiel: ~ var filter = Ersteller .Filter.In (c => c.Placements, listOfSiteIds); –
Misi