2013-09-06 12 views
5

Ho il seguente codice:MongoDb C# aggiornamento matrice nel documento

_eventInstanceRepository.GetInnerCollection().Update(
           Query.EQ("_id", listingEventModel.Id), 
           Update.PushWrapped<string[]>("ArtistIds", ids.ToArray())); 

che è stato progettato per aggiornare il seguente documento:

public class ListingEvent 
{  
    public ObjectId Id { get; set; } 
    public string[] ArtistIds { get; set; }   
} 

IDS è un elenco

Tutte le idee perché questo non sta aggiornando i documenti?

[UPDATE]

provato anche questo!

foreach (var id in ids) 
{ 
    _eventInstanceRepository.GetInnerCollection().Update(
           Query.EQ("_id", listingEventModel.Id), 
           Update.Push("ArtistIds", id)); 
} 

Nessuna fortuna ...

[UPDATE]

Tornando alla RavenDB - almeno per ora. Non vedo come MongoDb è una valida opzione per tutto il tempo non ci sono fonti reali parlano di (leggermente più complesso di struttura piatta) documento aggiorna su Internet e gli esempi che posso trovare semplicemente non funzionano.

[UPDATE]

ecco il codice repository:

public class Repository<T> : IRepository<T> 
{ 
    private readonly MongoCollection<T> _docs; 

    public Repository(MongoCollection<T> docs) 
    { 
     _docs = docs; 
    } 

    public IList<T> GetAll() 
    { 
     return _docs.FindAll().Select<T, T>(x => x.As<T>()).ToList(); 
    } 

    //HACK! 
    public MongoCollection<T> GetInnerCollection(){ 
     return _docs; 
    } 

    public void Save(T doc) 
    { 
     _docs.Save(doc); 
    } 

    public void Save(IEnumerable<T> docsToSave) 
    { 
     foreach (var doc in docsToSave) Save(doc); 
    } 

    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Delete(string id) 
    { 
     var query = Query.EQ("_id", id); 
     _docs.Remove(query); 
    } 
} 
+0

ciò che è GetInnerCollection - che non ci stai dando tutto il codice ... – Alex

+0

che letteralmente appena ottiene la raccolta interna - ho aggiornato con il repository. codice cs - è stato un trucco per poter provare a capire questo problema. – iwayneo

+0

Nota a margine: Il metodo 'GetAll' leggerà l'intera collezione in una sola volta e potrebbe essere necessario utilizzare LINQ to Objects per fare ... niente. Do 'MongoDatabase db; db.GetCollection (name) .FindAll() 'invece. Che ti dà un 'MongoCursor ' 'che implementa IEnumerable '. Convertilo in 'ToList' se necessario, ma usa sempre' SetLimit' sul cursore. – mnemosyn

risposta

2

Lavorare codice di esempio per l'aggiunta di una lista di stringhe a un elenco esistente di stringhe con un fortemente tipizzato Push:

class Event 
{ 
    public ObjectId Id { get; set; } 
    public string Name { get; set; } 
    public List<string> Participants { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MongoClient client = new MongoClient("mongodb://localhost/test"); 
     var db = client.GetServer().GetDatabase("test"); 
     var collection = db.GetCollection("events"); 
     var event0 = new Event { Name = "Birthday Party", 
      Participants = new List<string> { "Jane Fonda" } }; 
     collection.Insert(event0); 
     collection.Update(Query.EQ("_id", event0.Id), 
      Update<Event>.PushAll(p => p.Participants, 
       new List<string> { "John Doe", "Michael Rogers" })); 
    } 
} 
+1

PushAll era quello che non ho provato! – iwayneo

Problemi correlati