2010-10-04 29 views
11

Chúng tôi đang thực hiện tăng đột biến một chút trên Mongo DB cho dự án C# .NET của chúng tôi để xem liệu nó có phù hợp với chúng tôi hay không và tôi đã gặp vấn đề nhỏ với trình điều khiển mongodb-csharp bởi samus mà tôi không chắc chắn thực hiện.trình điều khiển mongodb-csharp - làm cách nào để lưu thuộc tính dưới dạng tham chiếu thay vì được nhúng?

Với mô hình đơn giản sau đây:

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

Chúng tôi đang cố gắng tìm ra, như các ý kiến ​​trên cho thấy, làm thế nào để lưu trang web như một kiểu tham chiếu thay vì nhúng vào vị trí. Trang web là bộ sưu tập cấp cao nhất của riêng mình mà thay đổi độc lập với từng Chiến dịch.

Lý tưởng nhất, tôi muốn làm điều này bằng cách sử dụng MongoConfigurationBuilder thay vì phải sửa đổi POCO của tôi. Tôi không thể tìm thấy bất kỳ tài liệu nào về cách thực hiện điều này.

Tôi đã hy vọng nó sẽ được dễ dàng như:

var config = new MongoConfigurationBuilder(); 

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

Nhưng điều đó vẫn nhúng Sites khi tôi sử dụng đoạn mã sau:

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

này được ban cho chúng ta:

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

Trong khi chúng tôi muốn một cái gì đó giống như:

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

Tôi không chắc đó có phải là tài liệu chính xác mà chúng tôi muốn kết thúc hay không, nhưng bạn sẽ nhận được điểm.

Tôi cảm thấy như thể tôi đang thiếu một cái gì đó hiển nhiên, nhưng không có tài liệu hướng dẫn tốt hơn về khía cạnh này của người lái xe, tôi sắp chụp trong bóng tối. Tôi thậm chí đã xem xét các bài kiểm tra trong nguồn và không thể tìm ra được.

Có ai biết cách thực hiện việc này không? Có thể không?

Trả lời

9

Vì mục đích này, bạn phải sử dụng DBRef.

Để làm điều này trong C#, bạn phải thay đổi lớp chiến dịch của bạn như thế này

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

Và chèn tài liệu tham khảo như thế này

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


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

campaignCollection.Save(firstCampaign); 

tôi đã không kiểm tra mã này, nhưng điều này đưa ra gợi ý cách thực hiện điều này.

+3

Điều này làm việc cảm ơn - mặc dù, những gì bạn có thể làm thay vì điều này chỉ là sử dụng một Oid. DBRef khá cồng kềnh và tất cả những gì bạn đang sử dụng trong trường hợp này là lấy ID để bạn có thể kéo lại trang web. – mrdowns

+0

DBRefs không thể được sử dụng trong đường ống tổng hợp cũng như rắc rối gấp đôi ở đây trong trường hợp bạn đi tuyến đó ..;) – ostati

+0

Bạn có thể đặt một ví dụ về cách bạn thực hiện một bộ lọc đơn giản trên danh sách các ref không? Ví dụ: ~ var filter = Nhà xây dựng .Filter.In (c => c.Placements, listOfSiteIds); – Misi

Các vấn đề liên quan