Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 运行集合组查询以查看my firebase子集合中的字段是true还是false_Javascript_Firebase_Google Cloud Firestore_Angularfire - Fatal编程技术网

Javascript 运行集合组查询以查看my firebase子集合中的字段是true还是false

Javascript 运行集合组查询以查看my firebase子集合中的字段是true还是false,javascript,firebase,google-cloud-firestore,angularfire,Javascript,Firebase,Google Cloud Firestore,Angularfire,我正在创建一个登录方法,尝试在验证当前用户的电子邮件地址后检查其是否同意我的协议条款。我的职能如下: SignIn(email, password) { return this.afAuth.auth.signInWithEmailAndPassword(email, password) .then(cred => { this.ngZone.run(() => { // Gets current sig

我正在创建一个登录方法,尝试在验证当前用户的电子邮件地址后检查其是否同意我的协议条款。我的职能如下:

SignIn(email, password) {
    return this.afAuth.auth.signInWithEmailAndPassword(email, password)
        .then(cred => {
            this.ngZone.run(() => {
                // Gets current signed in user.
                this.afAuth.authState.subscribe(user => {
                    // Queries Details subcollection.
            this.db.collection('users').doc(user.uid).collection('Details')
                        .get().toPromise().then(
                            doc => {
                                if (user.termsOfAgreement == false) {
                                    this.router.navigate(['terms']);
                                } else {
                                    this.router.navigate(['dashboard']);
                                }
                            })
                })
            });
        }).catch((error) => {
            window.alert(error.message)
        })
}
我知道我正在获取firebase用户对象,并且它不包含我的特定子集合字段名(即user.termsOfAgreement)。但我如何访问这些?我正在尝试检查我的termsOfAgreement字段是否为真

注册时我的Firestore用户集合状态

User (Collection)
- lastLogin: timestamp
- name: string
- userId: string

Details (subcollection)
- termsOfAgreement: false 

首先请注意,
this.db.collection('users').doc(user.uid).collection('Details')
不是一个集合组查询,而是对单个集合的读取操作

听起来您想检查用户文档下的
详细信息
集合是否包含
条款协议
等于true的文档。您可以通过以下方式轻松检查:

firebase.firestore()
        .collection('users').doc(user.uid)
        .collection('Details').where('termsOfAgreement', '==', true).limit(1)
        .get().then((querySnapshot) => {
            if (querySnapshot.empty == false) {
                this.router.navigate(['terms']);
            } else {
                this.router.navigate(['dashboard']);
            }
        })
上面的代码使用的是常规JavaScript SDK,因为此操作不需要使用AngularFire。但除此之外,这两种方法的效果都是一样的:对集合发出一个查询,然后检查是否有任何结果

除了修复代码外,这还通过两种方式对其进行优化:

  • 查询被发送到服务器,因此您只传输符合条件的数据
  • 最多传输一个文档,因为您只关心是否存在任何结果

  • 但我不确定为什么要在子集合中存储
    协议条款

    如果您检查是否存在任何子文档,其中<代码> TyMFStase是真实的,您可能需要考虑向用户文档本身添加<代码> TimeFase字段,这样您就不必在子集合上执行查询。


    一旦用户接受子集合中的任何条款,您就可以将此
    userDoc.termsOfAgreement
    设置为true,这样就不必再查询子集合(简化读取代码并减少读取操作的数量)。

    嘿,弗兰克,非常感谢您的指导。我仍然习惯于从SQL到NoSQL。我将把子集合提升到主文档级别。在你解释之后,这更有意义。