它不是SQL,肯定的,但與運算也支持在同一查詢複合條件,並使用Query.or方法手術室。換句話說,在過於籠統的風險,轉換你的邏輯析取形式:
(a OR b) AND (c OR d) = (a AND c) OR (b AND c) OR (a AND d) OR (b AND d)
,並建立查詢每個脫節操作,每個應用到它的多個一起操作數。
編輯 - 關於一個非常大的脫節,我沒有在文檔找到任何地方的限制,以通過或允許的查詢操作數的數量,但它是有道理的,會有一個限額和解析會繼續它很小。
當你用盡query.or限制,您可以通過連續運行批次,結果總結實施脫節。換句話說,將查詢分組到10個或其他內容中,使用OR連續運行它們,將每個結果添加到不包含重複項的累積集。
但是不管你怎麼樣分割,非常複雜的條件將導致會在某個時刻對資源限制跑起來(一些人爲的基於你在做什麼的薪酬層級上)在分析計算代價。
例如,假設你開始與上面的謂詞和你它轉化爲析取的形式,因爲我有。再說,Query.or也僅限於2個查詢。你仍然可以執行兩個或連續的,總結的結果是這樣的(在JS):
var queryAC = new Parse.Query("MyClass");
// set queryAC.whereEqualTo(), where... for constraint a
// set queryAC.whereEqualTo(), where... for constraint c
var queryBC = new Parse.Query("MyClass");
// set queryAC.whereEqualTo(), where... for constraint b
// set queryAC.whereEqualTo(), where... for constraint c
var queryAD = new Parse.Query("MyClass");
// set queryAC.whereEqualTo(), where... for constraint a
// set queryAC.whereEqualTo(), where... for constraint d
var queryBD = new Parse.Query("MyClass");
// set queryAC.whereEqualTo(), where... for constraint b
// set queryAC.whereEqualTo(), where... for constraint d
// now, run them as or, serially. in JS using promises...
var cumulativeResults = [];
Parse.Query.or(queryAC, queryBC).then(function(results) {
cumulativeResults = cumulativeResults.concat(results);
return Parse.Query.or(queryAD, queryBD);
// this is how to do it in js with promises, in Java, the
// equivalent idea is to run the next or in the completion
// callback of the first one
}).then(function (results) {
cumulativeResults = cumulativeResults.concat(results);
// remove dups here based on objectId, or do it in the line
// above when adding results.
// now cumulativeResults contains the OR sum of the original expression
});
關於應用德摩根的規則,解析處理底片象徵,通過提供負同行,例如可以用whereNotEqualTo
來抵消whereEqualTo
。我很確定這些功能並不完整......我偶爾遇到無法表達我需要的情況。我在那個時候的做法是儘可能少地讀入內存,並使用應用邏輯從那裏應用邏輯測試。
ps - 注意到您的歷史記錄中沒有標記爲正確或最高的答案。可能是合法的原因,但如果您標記了正確和最新的正確內容,那麼您會更好地關注您的問題並幫助網站投票選擇有用的內容。 (兩者都是在答案左上方的大數字旁邊的小控件完成的) – danh 2015-02-12 01:11:15