2013-09-06 5 views
5

Mam następujący kod:MongoDB array C# zmiana w dokumencie

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

który został zaprojektowany, aby zaktualizować następujący dokument:

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

identyfikatorów jest lista

Wszelkie pomysły, dlaczego tak nie aktualizuje dokumentów?

[UPDATE]

Próbowałem!

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

Nie traf ...

[UPDATE]

Wracając do RavenDb - przynajmniej na razie. Nie widzę sposobu, w jaki MongoDb jest realną opcją, przez cały czas, gdy nie ma prawdziwych źródeł omawiających (nieco bardziej złożonych niż płaska struktura) aktualizacji dokumentów w Internecie, a przykłady, które mogę znaleźć, po prostu nie działają.

[UPDATE]

Oto kod repozytorium:

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

czym jest GetInnerCollection - nie dajesz nam całego kodu ... – Alex

+0

To dosłownie dostaje wewnętrzną kolekcję - zaktualizowałem ją w repozytorium. kod cs - to był hack, więc mogłem spróbować rozwiązać ten problem. – iwayneo

+0

Nota boczna: Metoda "GetAll" odczytuje całą kolekcję za jednym zamachem i może być konieczne użycie linq do obiektów, aby ... nic. Wykonaj 'MongoDatabase db; db.GetCollection (nazwa) .FindAll() 'zamiast. To daje 'MongoCursor ' który implementuje 'IEnumerable '. Przekonwertuj to na 'ToList', jeśli musisz, ale zawsze używaj' SetLimit' na kursorze. – mnemosyn

Odpowiedz

2

Praca przykładowy kod do dołączania listę ciągów do istniejącej listy ciągów za pomocą silnie wpisany 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 był tym, którego nie próbowałem! – iwayneo