如何在couchbase lite中使用查询

时间:2017-05-09 02:50:12

标签: c# wpf couchbase-lite

我正在使用couchbase lite wpf项目。 我希望按日期约会。所以我用下面的代码创建了一个视图。

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 个答案:

答案 0 :(得分:1)

视图构建一个持久的静态索引。 View的map函数必须是纯函数,这意味着除了传入的文档之外,它不依赖于任何东西。如果你的map函数依赖于任何东西(比如当前日期),你将得到不一致的结果。看起来这可能是您案件中发生的事情。

Couchbase Lite的规则查看地图功能:

  • 一定是纯粹的&#34; function:这意味着无论何时使用相同的输入调用它,它必须产生完全相同的输出。换句话说,它不能使用任何外部状态,只需输入JSON。
  • 它不会产生副作用:它不应该改变任何外部状态,因为它在被调用时是不可预测的,或者它被调用的次数或者是什么订单文件传递给它。
  • 它必须是线程安全的:它可以在属于索引器的后台线程上调用,甚至可以在多个线程上并行调用。

请参阅Couchbase Lite Views上的文档。