2013-09-06 2 views
5

У меня есть следующий код:MongoDb массив C# обновление в документе

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

который предназначен для обновления следующий документ:

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

иды является списком

Любые идеи, почему это не обновляет документы?

[ДОПОЛНЕНО]

Также попробовал это!

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

Не повезло ...

[UPDATE]

Возвращаясь к RavenDb - по крайней мере сейчас. Я не вижу, как MongoDb является жизнеспособным вариантом, все время нет реальных источников, обсуждающих (немного более сложные, чем плоские) обновления документов в Интернете, и примеры, которые я могу найти, просто не работают.

[UPDATE]

Вот код хранилища:

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

Что такое GetInnerCollection - вы не даете нам всего кода ... – Alex

+0

Это буквально просто получает внутреннюю коллекцию - я обновил репозиторий. cs code - это был хак, чтобы я мог попытаться понять эту проблему. – iwayneo

+0

Боковое примечание: метод GetAll будет читать всю коллекцию за один раз, и, возможно, придется использовать linq для объектов, чтобы ничего ... ничего. Сделайте 'MongoDatabase db; db.GetCollection (name) .FindAll() 'вместо этого. Это дает вам «MongoCursor », который реализует 'IEnumerable '. Преобразуйте это в 'ToList', если вам нужно, но всегда используйте' SetLimit' в курсоре. – mnemosyn

ответ

2

Работа пример кода для добавления список строк в существующий список строк с использованием строго типизированных 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 был тем, кого я не пробовал! – iwayneo

Смежные вопросы