2012-10-13 56 views
2

我試圖通過C#驅動程序建模子集合,但我發現很難這樣做;你能幫我做些什麼嗎?或者有一些完整的例子可以用來做同樣的事情嗎?在c中建模mongodb子集合#

我試圖達到這個目標;

{ 
id:"id", name: 'name', Tokens:[{name:"yes",expiry:'Today'}, {name:"Hello", expiry:"tomorow"}] 
} 

我已經仿照這樣的

Class sample 
{ 
    [BSON] 
    public string id{get; set;} 
    public string name{get; set;} 
    public TokensCollection[] tokens(get; set;} 
} 

public class TokensCollection 
{ 
    public string name{get;set;} 
    public string expiry{get;set;} 
} 

而且在我嘗試初始化同一個這樣的庫類,

Sample sample1 = new Sample{ 
id = ObjectId.GenerateNewId().ToString(); 
name = "name"; 
//Best way to model this? any pointers? 
for (int index =1; index <=2; index++) 
{ 
    tokens[index].name = "me"; 
    tokens[index].expiry = "Today" 
} 

collection.insert(sample1); 

有人能幫助我嗎?

回答

0

我本來回答在MongoDb CSharp Google Group你的問題,這是一個有類似的問題的人的例子;

using System; 
using System.Collections.Generic; 
using System.Linq; 

using MongoDB.Bson; 
using MongoDB.Bson.Serialization.Attributes; 

using MongoDB.Driver; 
using MongoDB.Driver.Linq; 

namespace Test.ConsoleApp 
{ 

public class Sample 
{ 

    [BsonId] 
    public ObjectId Id { get; private set; } 
    public string Name { get; set; } 
    public List<Token> Tokens { get; set; } 

    public Sample() 
    { 
     Id = ObjectId.GenerateNewId(); 
     Tokens = new List<Token>(); 
    } 

} 

public class Token 
{ 
    public string Name { get; set; } 
    public string Expiry { get; set; } 
} 


public class Program 
{ 
    static void Main(string[] args) 
    { 
     var server = MongoServer.Create("mongodb://localhost/database?safe=true"); 
     var database = server.GetDatabase("test"); 
     var samplesCollection = database.GetCollection<Sample>("samples"); 

     Console.WriteLine("Creating Sample #1 ... "); 

     var sample1 = new Sample(); 
     sample1.Name = "Sample #1"; 
     sample1.Tokens.Add(new Token() { Name = "Name #1", Expiry = "Today" }); 

     Console.WriteLine("Creating Sample #2 ... "); 

     var sample2 = new Sample(); 
     sample2.Name = "Sample #2"; 
     sample2.Tokens.Add(new Token() { Name = "Name #2", Expiry = "Tomorrow" }); 
     sample2.Tokens.Add(new Token() { Name = "Name #3", Expiry = "Next Tuesday" }); 

     Console.WriteLine("Saving Sample #1 and #2 ... "); 

     samplesCollection.Save(sample1); 
     samplesCollection.Save(sample2); 

     Console.WriteLine("Fetching Sample #1 and #2 ... "); 

     var sampleOneFromDb = samplesCollection.AsQueryable<Sample>().Where(c => c.Name.Contains("Sample #1")); 

     Console.WriteLine("Sample #1 From DB - {0}", sampleOneFromDb.ToJson()); 
     Console.ReadLine(); 

    } 
    } 
} 
+0

是的,你做到了.. :) –

0

嗯,我設法找到答案。我用的IList,而使用數組和intialised這樣的對象,

有一些改動,在樣本類

Class Sample 
    { 
..... 

public List<TokensCollection> tokens{get; set;} 
} 

並初始化使用

Sample sample1 = new Sample() 
{ 

..... 

tokens = new List<TokensCollection>{ 
new TokensCollection(){name='name1', expiry ='expiry1'}, 
new TokensCollection(){name='name2', expiry ='expiry2'} 
} 

} 

應該插入相同您的嵌入式收藏文檔就像一個魅力。如果你想添加更多的docments你應該使用

tokes.add(new TokensCollection(){name='name3', expiry='expiry3}) 

所有最好的

+0

這應該與數組一起工作。 – cirrus

+0

確實的確..使用List更靈活.. –