2012-07-11 4 views
1

Ravendb (빌드 960)을 사용하여 문자열 목록에서 단일 값을 바꾸기 위해 문서 집합에 대한 대량 업데이트를 수행하려고합니다. 요청이 거의 동일했기 때문에 Google Group Question을 코드의 기반으로 사용했지만, 어떤 이유로 든 내 오류가 발생하는 동안 작업을 수행 할 수있었습니다. 문제를 데모하기 위해 다음 샘플 콘솔 응용 프로그램을 작성했습니다. 내가 실행하면Ravendb - 문자열 목록 패치

public class Document 
{ 
    public const string OLD_NAME = "Label A"; 
    public const string NEW_NAME = "Label B"; 

    public Document() 
    { 
     Labels = new List<string> { OLD_NAME }; 
    } 

    public string Id { get; set; } 
    public IList<string> Labels { get; set; } 
} 

public class Document_By_Labels : AbstractIndexCreationTask<Document> 
{ 
    public Document_By_Labels() 
    { 
     Map = leads => from doc in leads select new {doc.Labels}; 
    } 
} 

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     IDocumentStore store = new DocumentStore 
     { 
      Url = "http://localhost:8081", 
      DefaultDatabase = "RavendbPatchStringListTest" 
     }.Initialize(); 
     IndexCreation.CreateIndexes(typeof (Program).Assembly, store); 

     using (IDocumentSession session = store.OpenSession()) 
     { 
      var s = new Document(); 
      session.Store(s); 
      session.SaveChanges(); 

      var d = session.Load<Document>(s.Id); 
      var m = session.Advanced.GetMetadataFor(d); 
     } 

     store.DatabaseCommands.UpdateByIndex("Document/By/Labels", 
              new IndexQuery {Query = string.Format("Labels:\"{0}\"", Document.OLD_NAME)}, 
              new[] 
              { 
               new PatchRequest 
               { 
                Type = PatchCommandType.Modify, 
                Name = "Labels", 
                AllPositions = true, 
                Nested = 
                 new[] 
                 { 
                  new PatchRequest 
                  { 
                   Type = PatchCommandType.Remove, 
                   Value = new RavenJValue(Document.OLD_NAME) 
                  }, 
                  new PatchRequest 
                  { 
                   Type = PatchCommandType.Add, 
                   Value = new RavenJValue(Document.NEW_NAME) 
                  } 
                 } 
               } 
              }, allowStale: true); 
    } 
} 

내가 얻을 :

System.InvalidCastException: Unable to cast object of type 'Raven.Json.Linq.RavenJValue' to type 'Raven.Json.Linq.RavenJObject'. 
    at Raven.Json.Linq.Extensions.Convert[U](RavenJToken token, Boolean cast) in c:\Builds\RavenDB-Stable\Raven.Abstractions\Json\Linq\Extensions.cs:line 131 
    at Raven.Json.Linq.Extensions.Convert[U](RavenJToken token) in c:\Builds\RavenDB-Stable\Raven.Abstractions\Json\Linq\Extensions.cs:line 116 
    at Raven.Json.Linq.Extensions.Value[U](RavenJToken value) in c:\Builds\RavenDB-Stable\Raven.Abstractions\Json\Linq\Extensions.cs:line 24 
    at Raven.Database.Json.JsonPatcher.ModifyValue(PatchRequest patchCmd, String propName, RavenJToken property) in c:\Builds\RavenDB-Stable\Raven.Database\Json\JsonPatcher.cs:line 138 
    at Raven.Database.Json.JsonPatcher.Apply(PatchRequest patchCmd) in c:\Builds\RavenDB-Stable\Raven.Database\Json\JsonPatcher.cs:line 61 
    at Raven.Database.Json.JsonPatcher.Apply(PatchRequest[] patch) in c:\Builds\RavenDB-Stable\Raven.Database\Json\JsonPatcher.cs:line 30 
    at Raven.Database.DocumentDatabase.<>c__DisplayClassc1.<ApplyPatch>b__be(IStorageActionsAccessor actions) in c:\Builds\RavenDB-Stable\Raven.Database\DocumentDatabase.cs:line 1150 
    at Raven.Storage.Esent.TransactionalStorage.Batch(Action`1 action) in c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:line 330 
    at Raven.Database.DocumentDatabase.ApplyPatch(String docId, Nullable`1 etag, PatchRequest[] patchDoc, TransactionInformation transactionInformation) in c:\Builds\RavenDB-Stable\Raven.Database\DocumentDatabase.cs:line 1131 
    at Raven.Database.Impl.DatabaseBulkOperations.<>c__DisplayClass2.<UpdateByIndex>b__1(String docId, TransactionInformation tx) in c:\Builds\RavenDB-Stable\Raven.Database\Impl\DatabaseBulkOperations.cs:line 42 
    at Raven.Database.Impl.DatabaseBulkOperations.<>c__DisplayClassa.<PerformBulkOperation>b__5(IStorageActionsAccessor actions) in c:\Builds\RavenDB-Stable\Raven.Database\Impl\DatabaseBulkOperations.cs:line 80 
    at Raven.Storage.Esent.TransactionalStorage.ExecuteBatch(Action`1 action) in c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:line 376 
    at Raven.Storage.Esent.TransactionalStorage.Batch(Action`1 action) in c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:line 337 
    at Raven.Database.Impl.DatabaseBulkOperations.PerformBulkOperation(String index, IndexQuery indexQuery, Boolean allowStale, Func`3 batchOperation) in c:\Builds\RavenDB-Stable\Raven.Database\Impl\DatabaseBulkOperations.cs:line 75 
    at Raven.Database.Impl.DatabaseBulkOperations.UpdateByIndex(String indexName, IndexQuery queryToUpdate, PatchRequest[] patchRequests, Boolean allowStale) in c:\Builds\RavenDB-Stable\Raven.Database\Impl\DatabaseBulkOperations.cs:line 40 
    at Raven.Database.Server.Responders.DocumentBatch.<>c__DisplayClass3.<Respond>b__0(String index, IndexQuery query, Boolean allowStale) in c:\Builds\RavenDB-Stable\Raven.Database\Server\Responders\DocumentBatch.cs:line 47 
    at Raven.Database.Server.Responders.DocumentBatch.OnBulkOperation(IHttpContext context, Func`4 batchOperation) in c:\Builds\RavenDB-Stable\Raven.Database\Server\Responders\DocumentBatch.cs:line 64 
    at Raven.Database.Server.Responders.DocumentBatch.Respond(IHttpContext context) in c:\Builds\RavenDB-Stable\Raven.Database\Server\Responders\DocumentBatch.cs:line 46 
    at Raven.Database.Server.HttpServer.DispatchRequest(IHttpContext ctx) in c:\Builds\RavenDB-Stable\Raven.Database\Server\HttpServer.cs:line 550 
    at Raven.Database.Server.HttpServer.HandleActualRequest(IHttpContext ctx) in c:\Builds\RavenDB-Stable\Raven.Database\Server\HttpServer.cs:line 316 

것은 내가 프로세스가 나는 그렇지 않으면 밖으로 erroring되지 않을 뭔가 빠진해야 올바른 생각 생각하지만.

위의 중첩 패치에는 이름이 없으므로 동일한 오류로 여러 가지 콤보를 시도 했으므로주의하십시오. 시도의 예 : "", "$ 값", "레이블". 매번 같은 오류가 발생하고 문자열 목록에 이름이없는 것처럼 보이므로 위의 목적을 빠뜨린 것입니다.

미리 감사드립니다.

답변

1

나는 최근에 같은 일을하는 방법을 찾고있었습니다. 현재 패치 API를 사용하여 문자열 배열을 변경할 수없는 것처럼 들립니다. 아니 내가 찾고 있던 답이 순간에 유일한 해답이 될 것으로 보인다 동안 https://groups.google.com/forum/#!topic/ravendb/5qYWsq_ny0M

+0

:

내가 여기 꾸게 설명을 참조하십시오. 고맙습니다. –