2017-05-09 77 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