如何在 couchbase lite 中使用查询
How to use query in 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 中创建了视图。正确查看当天的 returns 约会。
但它 returns 今天也有同样的数据。我不确定哪里出了问题。
我对查看和查询感到困惑。
我不能使用像 SQL view table?
这样的视图
视图构建一个持久的静态索引。 View 的 map 函数必须是纯函数,这意味着它只能依赖于传入的文档。如果您的 map 函数依赖于任何东西(例如当前日期),您将得到不一致的结果。您的情况可能就是这样。
Couchbase Lite View 地图功能的规则:
- 它必须是一个 "pure" 函数:这意味着任何时候用相同的输入调用它,它必须产生完全相同的输出。换句话说,它不能使用任何外部状态,只能使用它的输入 JSON.
- 它不能有副作用:它不应该改变任何外部状态,因为它在何时被调用、被调用的频率或文档传递给它的顺序是不可预测的。
- 它必须是线程安全的:它可以在属于索引器的后台线程上调用,甚至可以同时在多个线程上并行调用。
请参阅 Couchbase Lite Views 上的文档。
我正在从事 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 中创建了视图。正确查看当天的 returns 约会。 但它 returns 今天也有同样的数据。我不确定哪里出了问题。 我对查看和查询感到困惑。 我不能使用像 SQL view table?
这样的视图视图构建一个持久的静态索引。 View 的 map 函数必须是纯函数,这意味着它只能依赖于传入的文档。如果您的 map 函数依赖于任何东西(例如当前日期),您将得到不一致的结果。您的情况可能就是这样。
Couchbase Lite View 地图功能的规则:
- 它必须是一个 "pure" 函数:这意味着任何时候用相同的输入调用它,它必须产生完全相同的输出。换句话说,它不能使用任何外部状态,只能使用它的输入 JSON.
- 它不能有副作用:它不应该改变任何外部状态,因为它在何时被调用、被调用的频率或文档传递给它的顺序是不可预测的。
- 它必须是线程安全的:它可以在属于索引器的后台线程上调用,甚至可以同时在多个线程上并行调用。
请参阅 Couchbase Lite Views 上的文档。