分析查询由子/点符号
TL;博士分析查询由子/点符号
能ParseCloud/MongoDB的过滤器由
Pointer<class>.filed
?通过Pointer<class>.Pointer<class>
?是否存在该领域的数据?
长的问题:
Round
是将自动播放时,时间会来的对象。
Payment
指示用户付款的对象。当支付正在使用时,我们将其设置为round
。
Player
哪些链接在线User
与Payment
我需要查询球员为几个条件:
-
Player
- 在线
- 具有有效(不
round
和valid
到 '有效')payment
-
Player
-
user
等于特定用户 - 等于没有
payment
-
-
Player
-
user
等于特定用户 - 具有有效(不
round
和valid
等于 '有效')支付
-
而且我做了一切,除了验证Payment
内Player
查询工作。
这里是条件从列表中。
var query = new Parse.Query(keys.Player);
query.skip(0);
query.limit(oneRoundMaxPlayers);
query.greaterThanOrEqualTo(keys.last_online_date, lastAllowedOnline);
// looks like no filter applied here
query.doesNotExist("payment.round");
query.exists(keys.payment);
// This line will make query return 0 elements
// query.equalTo("payment.valid", "valid");
query.include(keys.user);
query.include(keys.payment);
这里是2或3
var queryPaymentExists = new Parse.Query(keys.Player);
queryPaymentExists.skip(0);
queryPaymentExists.limit(1);
queryPaymentExists.exists(keys.payment);
//This line not filtering
queryPaymentExists.doesNotExist(keys.payment + "." + keys.round);
queryPaymentExists.equalTo(keys.user, user);
// This line makes query always return 0 elements
// queryPaymentExists.equalTo(keys.payment + "." + keys.valid, keys.payment_valid);
var queryPaymentDoesNotExist = new Parse.Query(keys.Player);
queryPaymentDoesNotExist.skip(0);
queryPaymentDoesNotExist.limit(1);
queryPaymentDoesNotExist.doesNotExist(keys.payment);
queryPaymentDoesNotExist.equalTo(keys.user, user);
var compoundQuery = Parse.Query.or(queryPaymentExists, queryPaymentDoesNotExist);
compoundQuery.include(keys.user);
compoundQuery.include(keys.payment);
compoundQuery.include(keys.payment + "." + keys.round);
我从蒙戈检查日志和他们看起来以下
verbose: REQUEST for [GET] /classes/Player: {
"include": "user,payment,payment.round",
"where": {
"$or": [
{
"payment": {
"$exists": true
},
"payment.round": {
"$exists": false
},
"user": {
"__type": "Pointer",
"className": "_User",
"objectId": "ASPKs6UVwb"
}
},
{
"payment": {
"$exists": false
},
"user": {
"__type": "Pointer",
"className": "_User",
"objectId": "ASPKs6UVwb"
}
}
]
}
}
这是响应:
verbose: RESPONSE from [GET] /classes/Player: {
"response": {
"results": [
{
"objectId": "VHU9uwmLA7",
"last_online_date": {
"__type": "Date",
"iso": "2017-10-28T15:15:23.547Z"
},
"user": {
"objectId": "ASPKs6UVwb",
"username": "cn92Ekv5WPJcuHjkmTajmZMDW",
},
"createdAt": "2017-10-22T11:43:16.804Z",
"updatedAt": "2017-10-25T09:23:20.035Z",
"ACL": {
"*": {
"read": true
},
"ASPKs6UVwb": {
"read": true,
"write": true
}
},
"__type": "Object",
"className": "_User"
},
"createdAt": "2017-10-27T21:03:35.442Z",
"updatedAt": "2017-10-28T15:15:23.556Z",
"payment": {
"objectId": "nr7ln7U3eJ",
"payment_date": {
"__type": "Date",
"iso": "2017-10-27T23:42:50.614Z"
},
"user": {
"__type": "Pointer",
"className": "_User",
"objectId": "ASPKs6UVwb"
},
"createdAt": "2017-10-27T23:42:50.624Z",
"updatedAt": "2017-10-28T15:12:30.131Z",
"valid": "valid",
"round": {
"objectId": "jF9gqG4ndh",
"round_date": {
"__type": "Date",
"iso": "2017-10-28T15:12:00.027Z"
},
"createdAt": "2017-10-28T15:11:00.036Z",
"updatedAt": "2017-10-28T15:12:30.108Z",
,
"ACL": {
"*": {
"read": true
}
},
"__type": "Object",
"className": "Round"
},
"ACL": {
"ASPKs6UVwb": {
"read": true
}
},
"__type": "Object",
"className": "Payment"
},
"ACL": {
"ASPKs6UVwb": {
"read": true
}
}
}
]
}
}
您可以看到该回复包含payment.round。
我的问题是以下几点:
- 可以通过
Pointer<class>.filed
ParseCloud/MongoDB的过滤器?由Pointer<class>.Pointer<class>
?是否存在该领域的数据? - 如何在我需要检查现场存在的情况下解决问题,如果
User
可以有可能Players
,User
可以有多个Payments
。
UPD 至于我发现蒙戈应该由“点号” mongodb query by sub-field 那我做错了支持筛选?
简短的回答:
- 没有
- 简化您的数据结构
龙答:
点符号可以用来
-
包括指针文档,正如您在代码中所做的那样,例如,
include(keys.user)
-
过滤器对于田地的性质,例如,
{properyA: 1, propertyB: 2}
。所有的数据都在字段中,而不是另一个由Parse指针引用的另一个集合中的文档。
点符号不能用作分析查询中的过滤器参数。 MongoDB也不支持这种过滤,pointer
的概念是Parse而不是MongoDB。在像MongoDB这样的NoSQL环境中,在查询语言中使用的表之间没有关系,因为它不像SQL数据库那样是“关系数据库”。然而,Parse为简单查询提供了一些SQL的舒适性,其概念为pointer
,compoundQuery
和matchesKeyInQuery
。
如果这还不够,只需将字段添加到集合中即可。费用可能会在多个集合中具有相同的字段和数据,但具有更快的查询执行时间的优势。
寻找正确的数据结构是NoSQL的重要主题之一,因为没有一般的权利结构。集合和文件结构基本上设计成关闭之间的权衡:安全
- 执行性能
- 查询必要性/频率
- (访问级别)
- 和数据存储大小
它们是液体,可以随时间变化。由于您的应用程序及其查询发生变化,如果长期收益高于一次性工作量,您还会更改数据结构。