使用Array解析或查询

时间:2018-03-06 13:52:22

标签: javascript parse-platform parse-server

我尝试从查询数组创建或查询。我需要使用一个数组,因为查询量没有固定,这取决于用户输入。

  

这是来自parse.com的一些示例代码,用于实现或查询。

var lotsOfWins = new Parse.Query("Player");
lotsOfWins.greaterThan("wins", 150);

var fewWins = new Parse.Query("Player");
fewWins.lessThan("wins", 5);

var mainQuery = Parse.Query.or(lotsOfWins, fewWins);
mainQuery.find()
  .then(function(results) {
    // results contains a list of players that either have won a lot of games or won only a few games.
  })
  .catch(function(error) {
    // There was an error.
  });

我想做的是

var orQueries = [];

使用Parse.Query对象在for循环中填充数组。然后我打电话给

var userQuery = new Parse.Query.or(orQueries);

导致内部服务器错误:

  

" TypeError:必须使用ParseObject或类名构造ParseQuery。

如何解决此问题并使用数组初始化查询?

2 个答案:

答案 0 :(得分:1)

如果@ danh的答案不起作用,您可以使用的一种解决方法是使用Parse.Promise.when()

这将接受一系列承诺,并在每个承诺完成后返回每个承诺的结果。对于查询,这意味着你最终会得到一个数组数组,你必须看出自己是什么(可能有一个单独的查询标识符数组来跟踪?)

var promises = [];

if( needToPerformQuery0 ) {
    var query0 = new Parse.Query("MyClass");
    // Set up query
    var promise = query0.find();
    promises.push(promise);
}

if( needToPerformQuery1 ) {
    var query1 = new Parse.Query("MyClass");
    // Set up query
    var promise = query1.find();
    promises.push(promise);
}

return Parse.Promise.when(promises).then(
    function( results ) {
        if( success.count > 0 ) {
             result0 = results[0];
             //Do something
        }
    },
    function( errors ) {
        console.log("There was at least one error: " + JSON.stringify(errors));
    }
);

答案 1 :(得分:0)

一个答案是使用JS来应用像这样的参数......

// In older JS:
var orQueries = [lotsOfWins, fewWins];
var querySum = Parse.Query.or.apply(null, orQueries);

// >=ES6:
var orQueries = [lotsOfWins, fewWins];
var querySum = Parse.Query.or(...orQueries);

我不知道查询数组长度的上限,但您应该注意不要将其完全置于用户控制之下。

编辑 - 如果查询数量很少并且生成相当小的结果集(例如总计不到1k?),您可以放弃Query.or并执行"或&#34 ;自己动手......

const _ = require('underscore');

function disjunctiveQuery(queries) {
    return Promise.all(queries).then(results => _.uniq(_.flatten(results), 'id'));
}

disjunctiveQuery([queryA, queryB, queryC, queryD]).then( ...