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);
}
}
czym jest GetInnerCollection - nie dajesz nam całego kodu ... – Alex
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
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