2017-05-09 67 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創建了該視圖。該視圖正確返回當天的約會。 但它今天也返回相同的數據。我不確定什麼是錯的。 我對查看和查詢感到困惑。 我不能像SQL視圖表一樣使用視圖嗎?

回答

1

視圖構建一個持久的靜態索引。 View的map函數必須是一個純函數,這意味着它不能依賴任何東西,除了傳入的文檔。如果你的map函數依賴於任何東西(比如當前日期),你將得到不一致的結果。看起來這可能是你的情況發生了什麼。

規則Couchbase精簡版查看地圖功能:

  • 它必須是一個「純粹」的功能:也就是說,它被稱爲具有相同輸入任何時候,它必須產生相同的輸出。換句話說,它不能使用任何外部狀態,只是它的輸入JSON。
  • 它不能有副作用:它不應該改變任何外部狀態,因爲它被調用的時候是不可預知的,或者它被調用的頻率或者文件傳遞給它的順序。
  • 它必須是線程安全的:它可以在屬於索引器的後臺線程上調用,或者甚至可以在多個線程上同時並行調用。

請參閱Couchbase Lite Views的相關文檔。

+1

嗨,霍德,謝謝你的回答。 那麼我怎樣才能做出像邏輯查詢。如果您有任何示例代碼,請發送給我。 – Meteoric

+0

我無法真正在Stack Overflow上做到這一點(它不符合發佈準則)。我建議在Couchbase論壇上進行跟進(https://forums.couchbase.com/t/how-to-use-query/12757/2)。 – Hod