2017-05-09 7 views
0

私はcouchbase lite wpfプロジェクトに取り組んでいます。 私は日付で予定を取得したいと思います。そこで以下のコードでビューを作成しました。couchbase liteでのクエリの使い方

appointments.AddRange(App.StorageRepository.Query<AppointmentModel>(map, limit, offset, TodayWhere)); 



bool TodayWhere(IDictionary<string, object> accessDoc, IDictionary<string, object> parameters) 
      { 
       var tableName = parameters["table"].ToString(); 
       if (!accessDoc["_id"].ToString().Contains(tableName)) 
       { 
        return false; 
       } 
       var startDay = Convert.ToDateTime(accessDoc["startDate"].ToString()); 
       var today = Convert.ToDateTime(parameters["today"].ToString()); 
       if (startDay.Date != today.Date) 
       { 
        return false; 
       } 
       return true; 
      } 

public List<T> Query<T>(IDictionary<string, object> map, int limit, int offset, Func<IDictionary<string, object>, IDictionary<string, object>, bool> monitoring) 
     { 
      List<T> list = new List<T>(); 
      var viewName = map["view"].ToString(); 
      var view = Manager.SharedInstance.GetDatabase(DatabaseName).GetView(viewName); 
      view.SetMap((doc, emit) => 
       { 
        if (!monitoring(doc, map)) 
        { 
         return; 
        } 
        emit(doc, null); 
       }, "1.0"); 

      var query = view.CreateQuery(); 
      query.Limit = limit; 
      query.Descending = true; 
      var queryResult = 
       query 
       .Run() 
       .ToList(); 
      foreach (var item in queryResult) 
      { 
       var doc = GetObject<T>(item.Document.UserProperties); 
       list.Add(doc); 
      } 
      return list; 
     } 

このコードは機能していますが、問題があります。 たとえば、 2016.05.06にビューを作成しました。このビューは、その日の予定を正しく返します。 しかし今日でも同じデータが返されます。私は何が間違っているのか分かりません。 私はViewとクエリについて混乱しています。 SQLビュー表のようなビューを使用できません。

答えて

1

ビューは永続的な静的インデックスを作成します。ビューのマップ関数は純粋な関数でなければなりません。つまり、渡されたドキュメント以外のものに依存することはできません。マップ関数が(現在の日付のような)何かに依存していると、一貫性のない結果が得られます。これは、あなたの場合に起こっている可能性がありますように見えます。 CouchbaseのLiteの地図を見る機能について

ルール:

  • それは「純粋な」関数でなければなりません:それはそれは同じ入力と呼ばれています任意の時間を意味し、それはまったく同じ出力を生成する必要があります。つまり、外部状態は使用できません。入力されたJSONだけです。
  • 副作用はありません:呼び出されたときや呼び出された頻度、またはドキュメントがどの順序で渡されたかは予測できないため、外部状態は変更しないでください。
  • スレッドセーフである必要があります。インデクサーに属しているバックグラウンドスレッドで呼び出される場合もあります。同時に複数のスレッドで同時に呼び出される場合もあります。

Couchbase Lite Viewsのドキュメントを参照してください。

+1

こんにちは、あなたの答えをありがとう。 それでは、ロジックのようにクエリを作成するにはどうしたらいいですか?サンプルコードがあれば、私に送ってください。 – Meteoric

+0

私は実際にスタックオーバーフローでそれを行うことはできません(投稿ガイドラインに合わない)。私は、Couchbaseフォーラム(https://forums.couchbase.com/t/how-to-use-query/12757/2)でフォローアップすることをお勧めします。 – Hod

関連する問題