分析查询由子/点符号

分析查询由子/点符号

问题描述:

TL;博士分析查询由子/点符号

能ParseCloud/MongoDB的过滤器由Pointer<class>.filed?通过 Pointer<class>.Pointer<class>?是否存在该领域的数据?

长的问题:

Round是将自动播放时,时间会来的对象。

Payment指示用户付款的对象。当支付正在使用时,我们将其设置为round

Player哪些链接在线UserPayment

我需要查询球员为几个条件:

  1. Player

    • 在线
    • 具有有效(不roundvalid到 '有效')payment
  2. Player

    • user等于特定用户
    • 等于没有payment
  3. Player

    • user等于特定用户
    • 具有有效(不roundvalid等于 '有效')支付

而且我做了一切,除了验证PaymentPlayer查询工作。

这里是条件从列表中。

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。

我的问题是以下几点:

  1. 可以通过Pointer<class>.filed ParseCloud/MongoDB的过滤器?由Pointer<class>.Pointer<class>?是否存在该领域的数据?
  2. 如何在我需要检查现场存在的情况下解决问题,如果User可以有可能PlayersUser可以有多个Payments

UPD 至于我发现蒙戈应该由“点号” mongodb query by sub-field 那我做错了支持筛选?

简短的回答:

  1. 没有
  2. 简化您的数据结构

龙答:

点符号可以用来

  • 包括指针文档,正如您在代码中所做的那样,例如, include(keys.user)
  • 过滤器对于田地的性质,例如, {properyA: 1, propertyB: 2}。所有的数据都在字段中,而不是另一个由Parse指针引用的另一个集合中的文档。

点符号不能用作分析查询中的过滤器参数。 MongoDB也不支持这种过滤,pointer的概念是Parse而不是MongoDB。在像MongoDB这样的NoSQL环境中,在查询语言中使用的表之间没有关系,因为它不像SQL数据库那样是“关系数据库”。然而,Parse为简单查询提供了一些SQL的舒适性,其概念为pointer,compoundQuerymatchesKeyInQuery

如果这还不够,只需将字段添加到集合中即可。费用可能会在多个集合中具有相同的字段和数据,但具有更快的查询执行时间的优势。

寻找正确的数据结构是NoSQL的重要主题之一,因为没有一般的权利结构。集合和文件结构基本上设计成关闭之间的权衡:安全

  • 执行性能
  • 查询必要性/频率
  • (访问级别)
  • 和数据存储大小

它们是液体,可以随时间变化。由于您的应用程序及其查询发生变化,如果长期收益高于一次性工作量,您还会更改数据结构。