2013-09-06 4 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; }   
} 

ID를하는 목록

어떤 아이디어 왜이 문서를 업데이트하지 않습니까?

[업데이트]

적어도 지금은 - 다시 RavenDb로 돌아가서

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

운 ...

[업데이트]

. 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 코드 - 해킹으로이 문제를 해결할 수있었습니다. – iwayneo

+0

사이드 노트 :'GetAll' 메쏘드는 한 번에 전체 콜렉션을 읽을 것이고, 할 일에 linq를 사용해야 할 것입니다. 'MongoDatabase db; 대신 db.GetCollection (이름) .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