2

特定の基準を満たすすべてのドキュメントについて、それらのドキュメントのフィールドをパッチ更新したいと考えています。このために、必要なドキュメントのサブセットを取得するクエリを LINQ Pad で作成しました。

あれは :

Session.Query<Movie>()    
.Where(x => x.Status == "Released" && x.IsDeleted == false && x.ReleaseDate.Date < new DateTime(2012, 4, 3))
.Dump();

これでドキュメントのリストができました。しかし、フィールドを変更する必要があります。このために、index コマンドと patch コマンドを作成しました。このタスクを完了するには、助けが必要です。

パッチコード (不完全) :

  store.DatabaseCommands.UpdateByIndex("Movies/NewIndexName",
         new IndexQuery { Query = "IsDeleted:false" },
         new[]
        {
          new PatchRequest
              {
                  Type = PatchCommandType.Modify,
                  Name = "Status",
                  Value = "Testing"
               }
        }, allowStale: false);

インデックスは

  from doc in docs.Movies
  select new { ReleaseDate = doc.ReleaseDate.Date, IsDeleted = doc.IsDeleted, Status =

  doc.Status }

具体的には、私の質問は..私のアプローチは正しいですか..そうであれば、条件に複数の基準を追加するにはどうすればよいですか.. Query = "IsDeleted:false"と書かれている場所で、クエリに比較チェックを追加できますか(上記の LINQ クエリ)?

編集:(ダニエル・ラングのソリューションを使用)

これにより、フォーマット例外が発生します。入力文字列が正しいフォーマットではありません。

store.DatabaseCommands.UpdateByIndex("Movies/NewIndexName",
             new IndexQuery
             {
                 Query =
         string.Format("Status:Released AND IsDeleted:false AND ReleaseDate:{* TO {0}}",
         DateTools.DateToString(new DateTime(2012, 4, 3),
                                DateTools.Resolution.MILLISECOND))
             },
             new[]
            {
              new PatchRequest
                  {
                      Type = PatchCommandType.Modify,
                      Name = "Status",
                      Value = "TestingReleased"
                   }
            }, allowStale: false);
4

2 に答える 2

4

次のようにクエリを記述できます。

store.DatabaseCommands.UpdateByIndex("Movies/NewIndexName",
         new IndexQuery { Query = "IsDeleted:false AND Status:Release" },
         ....

注いつでもLINQクエリを呼び出しToString()て、バックグラウンドで生成されたLuceneクエリを確認できます(またはFiddlerを使用してクエリがネットワークを通過するのを確認できます)

Session.Query<Movie>()    
.Where(x => x.Status == "Released" && x.IsDeleted == false && x.ReleaseDate.Date < new DateTime(2012, 4, 3))
.ToString()
于 2012-04-18T19:50:41.687 に答える
4

はい、複数の条件を設定し、標準のブール演算を使用してそれらを組み合わせることができます。ここで実際にluceneクエリを作成しているので、このWebサイトを見て、それらを作成する方法について詳しく見ていきましょう。http: //lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html#ブール値%20operators

日付についてのことは、レイヴンがそれらを(他のすべてとして)文字列として保存し、使用する形式が範囲クエリやそのようなものを有効にするために特別に選択されているため、期待したものではない可能性があります...

したがって、日付を照会するには、特別な方法で日付をフォーマットする必要があります。Raven.Abstractions.Linq内に、役立つDateToStringメソッドを持つDateToolsクラスがあります。

次のように、上記から同じクエリを作成できます。

(文字列に{}を追加するために4/27を編集)

Query = 
    string.Format("IsDeleted:false AND ReleaseDate:{{* TO {0}}}",
    DateTools.DateToString(new DateTime(2012,4,3), 
                           DateTools.Resolution.MILISECONDS))
于 2012-04-18T19:51:09.703 に答える