2017-07-11 16 views
0

RavenDBとHangFireには非常に新しく、バックグラウンドタスクを作成していますが、フィールドがインデックスに登録されていないため、Raven.Database.Indexingでインデックスが作成されていないフィールドでクエリできません。

{ 
    "HotelId": "hotels/1474", 
    "RoomNumber": "407", 
    "Floor": "4th Floor", 
    "Status": "DND", 
    "RoomType": "Guest Room", 
    "RoomTemplate": "1474_Install_SBBs.json", 
    "Json": { 
    "main": { 
     "picRoomNumber": "Images/Photos/d5/d5de2652-08c3-49c7-a75a-446934962a1d.jpg", 
     "qrCode": "http://2d.my/36tn" 
    }, 
    "taskSBB1": { 
     "deviceTvModelValue": "Other", 
     "tvLocation": "None", 
     "deviceTvModel": "Other", 
     "itemSbbRemoved": 0, 
     "deviceSbbQr": "http://2d.my/36tm", 
     "deviceTvMountType": "Articulating wall mount", 
     "deviceTvMountTypeValue": "Articulating wall mount", 
     "tvLocationValue": "", 
     "taskTechName": "Anton Anskin", 
     "taskName": "Install SBB", 
     "deviceTvSn": "703rmcj83595", 
     "taskStatus": "In Progress", 
     "deviceSbbPhotoMount": "Images/Photos/84/8410b77b-20f2-4146-b9cb-19e9dd3259ef.jpg", 
     "taskStarted": "2017-06-06T14:50:34.046000Z" 
    }, 
    "tasks": [ 
     "taskSBB1" 
    ], 
    "survey": { 
     "sbbCount": "1", 
     "damageBoolean": 0 
    } 
    }, 
    "LastUpdatedBy": "Mark", 
    "LastUpdatedUtc": "2017-07-10T18:46:27.9305296Z", 
    "StartedBy": null, 
    "StartedUtc": "2017-06-06T14:50:34.0460000Z", 
    "CompletedBy": null, 
    "CompletedUtc": "0001-01-01T00:00:00.0000000", 
    "CompletedDate": "0001-01-01T00:00:00.0000000", 
    "DndBy": "Mark", 
    "DndUntilUtc": "2017-07-10T21:46:00.0000000Z", 
    "RoomPhotos": [ 
    { 
     "Key": "main", 
     "Name": "picRoomNumber", 
     "ImagePath": "Images/Photos/d5/d5de2652-08c3-49c7-a75a-446934962a1d.jpg", 
     "AddedBy": "Anton", 
     "AddedUtc": "2017-06-06T14:51:16.6010049Z" 
    }, 
    { 
     "Key": "taskSBB1", 
     "Name": "deviceSbbPhotoMount", 
     "ImagePath": "Images/Photos/84/8410b77b-20f2-4146-b9cb-19e9dd3259ef.jpg", 
     "AddedBy": "Anton", 
     "AddedUtc": "2017-06-06T14:51:17.2572542Z" 
    } 
    ], 
    "Issues": [], 
    "Scans": [], 
    "ChangeLog": [], 
    "CurrentPhase": null 
} 

そして、私はエラーになっています:

 "Error": "System.ArgumentException: The field 'DndUntilUtc' is not indexed, cannot query on fields that are not indexed\r\n at Raven.Database.Indexing.Index.AssertQueryDoesNotContainFieldsThatAreNotIndexed(IndexQuery indexQuery, AbstractViewGenerator viewGenerator)\r\n at Raven.Database.Indexing.Index.IndexQueryOperation.<Query>d__57.MoveNext()\r\n at Raven.Database.Util.ActiveEnumerable`1..ctor(IEnumerable`1 enumerable)\r\n at Raven.Database.DocumentDatabase.<>c__DisplayClass96.<Query>b__8b(IStorageActionsAccessor actions)\r\n at Raven.Storage.Esent.TransactionalStorage.ExecuteBatch(Action`1 action, EsentTransactionContext transactionContext)\r\n at Raven.Storage.Esent.TransactionalStorage.Batch(Action`1 action)\r\n at Raven.Database.DocumentDatabase.Query(String index, IndexQuery query, CancellationToken externalCancellationToken, Action`1 headerInfo, Action`1 onResult)\r\n at Raven.Database.Server.Responders.QueryStreams.Respond(IHttpContext context)\r\n at Raven.Database.Server.HttpServer.DispatchRequest(IHttpContext ctx)\r\n at Raven.Database.Server.HttpServer.HandleActualRequest(IHttpContext ctx)" 
    } 

     Source=Raven.Client.Lightweight 
     StackTrace: 
     at Raven.Client.Connection.HttpJsonRequest.RawExecuteRequest() 
     at Raven.Client.Connection.ServerClient.StreamQuery(String index, IndexQuery query, QueryHeaderInformation& queryHeaderInfo) 
     at Raven.Client.Document.DocumentSession.Stream[T](IDocumentQuery`1 query, QueryHeaderInformation& queryHeaderInformation) 
     at Raven.Client.Document.DocumentSession.Stream[T](IQueryable`1 query, QueryHeaderInformation& queryHeaderInformation) 
     at Raven.Client.Document.DocumentSession.Stream[T](IQueryable`1 query) 
を文書に

public static void UpdateDoNotDisturb() 
    { 
     IList<HotelRoom> rooms = new List<HotelRoom>(); 
     Hotel project; 
     IQueryable<HotelRoom> queryableObj; 
     //Update Rooms with DND status and DndUntil greater than now. 
     using (var session = MvcApplication.DocumentStore.OpenSession()) 
     { 
      queryableObj = session.Query<HotelRoom, HotelRoom_Search>().Where(x => x.Status == "DND" && x.DndUntilUtc < DateTime.Now).OfType<HotelRoom>(); 
      //queryableObj = session.Query<HotelRoom, HotelRoom_Search>().Where(x => x.Status == "DND").OfType<HotelRoom>(); 
      using (var enumerator = session.Advanced.Stream(queryableObj)) 
      { 
       while (enumerator.MoveNext()) 
       { 
        var room = enumerator.Current.Document; 
        rooms.Add(room); 
       } 
      } 
     } 

    } 

:以下に示すように文書をravendb

このエラーを修正する方法とその理由は不思議です。ありがとうございました。

答えて

4

'HotelRoom_Search'というインデックスを 'DndUntilUtc'というプロパティでクエリしていますが、インデックスにはそのインデックスが含まれていません。

lucene/ravendbの世界では、特定のプロパティ[、コレクション(またはSQLワールド内のテーブル)には含まれていますが]でインデックスをクエリすると、インデックスに含まれている場合にのみ機能します。 「DndUntilUtc」フィールドをインデックスに追加するだけです。

私はそれがこのようなものだと思いますので、あなたのあなたのインデックス定義が含まれていない:

public class HotelRoom_Search : AbstractIndexCreationTask<HotelRoom> 
{ 
    public HotelRoom_Search() 
    { 
     Map = rooms => from room in rooms 
         select new 
         { 
          //bla bla 
          room.DndUntilUtc // add this line 
          //bla bla 
         }; 

     Indexes.Add(x => x.DndUntilUtc, FieldIndexing.Analyzed); 

    } 
} 

とこれを実行することを忘れないでください、そうサーバはインデックス定義を更新することになります。

var store = new DocumentStore { //....} 
new HotelRoom_Search().Execute(Store); 

UPDATE:

あなたは、インデックスを指定せずにオブジェクトHotelRoomを照会することができ、これを克服するために(session.QueryにTとしてだけでエンティティを渡します)。これはあなたのクエリで使用するプロパティに応じてravendbがAutoインデックスを作成するようにします。

ravendbドキュメント:

インデックスは、ユーザーが一致するものがない場合RavenDBは、クエリに一致する場合、既存のインデックスを使用するか、または新しいものを作成するクエリを発行するたびに、クエリを満たすためにサーバーによって使用されています。 クエリを発行して作成されたインデックスは、動的インデックスまたは自動インデックスと呼ばれ、名前が自動/プレフィックスで始まるため、簡単に識別できます。 ユーザによって明示的に作成されたインデックスは、呼び出されます。

は通常、あなたはパフォーマンスチューニングへの道ravenがインデックス(および取り出し)ドキュメントを制御したいので、それは良いオプションが、デフォルトとして良いではありません。

もちろん、バグは修正されません。

+0

詳しい理由と理由についてはどうもありがとうございます。非常に明確な答え。 – yams

+1

ようこそ。 btw、私は強くluceneについて読むことを強くお勧めします。なぜなら、ravendbはluceneに基づいているからです。本のルーケン、マナーパブを試してみてください。私はあなたが答えとしてそれを受け入れると感謝します。 –

関連する問題