解析Javascript SDK查询:使用AND组合两个查询

sha*_*are 3 parse-platform

我有一个名为的类Event,它有一个名为end_timeDate的列和一个名为titleString类的列.我想获取其end_time列未定义或大于或等于的事件new Date().这并不难,因为可以使用以下代码完成:

var query1 = new Parse.Query(Event);
var query2 = new Parse.Query(Event);
query1.doesNotExist("end_time");
query2.greaterThanOrEqualTo("end_time", new Date());

var query1And2 = Parse.Query.or(query1, query2);
Run Code Online (Sandbox Code Playgroud)

query1And2可以正确返回我想要的结果.但是,问题是如果我再添加一个约束:给定用户指定的标题,返回标题未定义或等于用户指定标题的事件.这种约束并不难以自己构建,例如:

var query3 = new Parse.Query(Event);
var query4 = new Parse.Query(Event);
query3.doesNotExist("title");
query4.equalTo("title", userTitle);

var query3And4 = Parse.Query.or(query3, query4);
Run Code Online (Sandbox Code Playgroud)

但是,我怎样才能Event同时查询query1And2query3And4

dan*_*anh 5

这些约束可以通过一点布尔数学来实现.看起来您已经明白,解析允许您通过将多个查询与Query.or()**组合来指定单个查询和析取(或)约束的连接(和)约束.因此,为了获得您所瞄准的约束,我们需要将您的查询逻辑转换为不同的形式.

您的个人谓词是:

A = doesNotExist("end_time")
B = greaterThanOrEqualTo("end_time", new Date())
C = doesNotExist("title")
D = equalTo("title", userTitle)
Run Code Online (Sandbox Code Playgroud)

我们希望生成查询:

(A or B) and (C or D)
Run Code Online (Sandbox Code Playgroud)

使用代数将此产品的总和重写为产品总和,我们得到:

= (A and C) or (B and C) or (A and D) or (B and D)
=   q0   or    q1    or   q2    or   q3
Run Code Online (Sandbox Code Playgroud)

其中q0..q3是由ANDed约束约束的查询.将它们渲染为代码:

var q0 = new Parse.Query(Event);
q0.doesNotExist("end_time");
q0.doesNotExist("title");

var q1 = new Parse.Query(Event);
q1.greaterThanOrEqualTo("end_time", new Date());
q1.doesNotExist("title");

var q2 = new Parse.Query(Event);
q2.doesNotExist("end_time");
q2.equalTo("title", userTitle);

var q3 = new Parse.Query(Event);
q3.greaterThanOrEqualTo("end_time", new Date());
q3.equalTo("title", userTitle);

var querySum = Parse.Query.or(q0, q1, q2, q3);
Run Code Online (Sandbox Code Playgroud)

**Query.or()可能只是像Promise.when()那样单独运行那些查询并结合结果,但我们假设解析在这方面比在应用程序级别做得更好.