用数组解析或查询
Parse or query with Array
我正在尝试从一组查询中创建一个 or 查询。我需要使用数组,因为查询的数量不是固定的,它取决于用户输入。
This is some sample code from parse.com to implement an or query.
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: A ParseQuery must be constructed with a ParseObject or class name.
如何解决这个问题并使用数组初始化查询?
一个答案是使用 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
并执行 "or" 自己工作...
const _ = require('underscore');
function disjunctiveQuery(queries) {
return Promise.all(queries).then(results => _.uniq(_.flatten(results), 'id'));
}
disjunctiveQuery([queryA, queryB, queryC, queryD]).then( ...
如果@danh 的回答不起作用,您可以采取的一种解决方法是使用 Parse.Promise.when()
.
这接受了一系列承诺,并且 returns 每个承诺的结果,一旦每个承诺完成。对于查询,这意味着你最终会得到一个数组数组,你必须自己辨别什么是什么(也许有一个单独的查询标识符数组来跟踪?)
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));
}
);
我正在尝试从一组查询中创建一个 or 查询。我需要使用数组,因为查询的数量不是固定的,它取决于用户输入。
This is some sample code from parse.com to implement an or query.
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: A ParseQuery must be constructed with a ParseObject or class name.
如何解决这个问题并使用数组初始化查询?
一个答案是使用 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
并执行 "or" 自己工作...
const _ = require('underscore');
function disjunctiveQuery(queries) {
return Promise.all(queries).then(results => _.uniq(_.flatten(results), 'id'));
}
disjunctiveQuery([queryA, queryB, queryC, queryD]).then( ...
如果@danh 的回答不起作用,您可以采取的一种解决方法是使用 Parse.Promise.when()
.
这接受了一系列承诺,并且 returns 每个承诺的结果,一旦每个承诺完成。对于查询,这意味着你最终会得到一个数组数组,你必须自己辨别什么是什么(也许有一个单独的查询标识符数组来跟踪?)
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));
}
);