Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Angular 角度火从同一集合中获取相关数据_Angular_Firebase_Google Cloud Firestore_Angularfire5 - Fatal编程技术网

Angular 角度火从同一集合中获取相关数据

Angular 角度火从同一集合中获取相关数据,angular,firebase,google-cloud-firestore,angularfire5,Angular,Firebase,Google Cloud Firestore,Angularfire5,我面临一个奇怪的行为,询问我的firestore项目。项目的一个用户就像系统的所有者,我们称他为生产者。其他用户,可以属于一个生产者,因此我有一个用户的集合,其中有一个名为生产者的字段,具有生产者ID,如下所示 {user: {id: '...', producer: '...', ...} *把制作人翻译成制作人 我有一个叫做转账的功能,我可以将现金从一个用户帐户转账到另一个用户帐户,但只能在同一个制作人的用户内转账。因此,我需要获取生产者与登录用户相同的所有用户,在此集合中,我的函数如下

我面临一个奇怪的行为,询问我的firestore项目。项目的一个用户就像系统的所有者,我们称他为生产者。其他
用户
,可以属于一个
生产者
,因此我有一个
用户的集合
,其中有一个名为
生产者
的字段,具有
生产者ID
,如下所示

{user: {id: '...', producer: '...', ...}
*把制作人翻译成制作人

我有一个叫做转账的功能,我可以将现金从一个用户帐户转账到另一个用户帐户,但只能在同一个制作人的用户内转账。因此,我需要获取生产者与登录用户相同的所有用户,在此集合中,我的函数如下:

constructor(
  private afAuth: AngularFireAuth,
  private afs: AngularFirestore
) { }

fetchUsers() {
  return this.afAuth.authState.pipe(
    switchMap( user => { // Here I have the logged user
      return this.afs.doc(`users/${user.uid}`).valueChanges() // Here I need his details on users collection
    }),
    first(),
    switchMap( (user: any) => {
      return this.afs.collection('users',
        ref => ref.where('producer', '==', user.producer) // Now I want the other users from same producer
      ).valueChanges()
    })
  )
}
但它不起作用,结果中唯一的用户是调用函数的用户。这是角射的限制还是我做得不对

我认为这可能是一个bug,因为我可以使用get-on文档和collection来解决这个问题:

return this.afAuth.authState.pipe(
            switchMap( user => {
                return this.afs.doc(`users/${user.uid}`).get()
            }),
            first(),
            map( usuario => {
                return usuario.data()
            }),
            switchMap( (usuario: any) => {
                return this.afs.collection('users', ref => ref.where('produtor', '==', usuario.produtor)).get()
            }),
            first(),
            map( data => {
                let users = []
                data.docs.map( doc => {
                    users.push(doc.data())
                })
                return users
            })
       )

这样,它将返回生产者produtor与登录用户相同的所有用户。如果有人能解释一下原因,我将不胜感激。

看起来您的查询逻辑不正确

return this.afs.collection('users',
        ref => ref.where('producer', 'in', [user.producer, user.uid]) 
).valueChanges()

事实上,看起来你根本不需要一个或一个条件。为什么要将
user.producer
设置为两种不同的类型

ie:如果
user.producer
始终设置为生产者ID,则您可以只设置:

return this.afs.collection('users',
            ref => ref.where('producer', '==', user.uid) 
    ).valueChanges()

看起来您的或查询逻辑不正确

return this.afs.collection('users',
        ref => ref.where('producer', 'in', [user.producer, user.uid]) 
).valueChanges()

事实上,看起来你根本不需要一个或一个条件。为什么要将
user.producer
设置为两种不同的类型

ie:如果
user.producer
始终设置为生产者ID,则您可以只设置:

return this.afs.collection('users',
            ref => ref.where('producer', '==', user.uid) 
    ).valueChanges()

当您在Angular Fire中调用.valueChanges()时,它将返回一个可观测值

可观测数据打开了一个连续的通信通道,在这个通道中,随着时间的推移,可以发出多个数据值

所以我们需要从一个可观测的数据中得到一个值,为此我们需要订阅它。 您可以使用for valueChanges调用文档,并按如下方式附加管道(take(1)),但是get()非常方便

   this.afs.doc(`users/${user.uid}`).valueChanges()
   .pipe(take(1))
   .subscribe(v => {
       console.log(v);
    });

如果您需要进一步的说明,请告诉我。

当您在Angular Fire中调用.valueChanges()时,它会返回一个可观察的值

可观测数据打开了一个连续的通信通道,在这个通道中,随着时间的推移,可以发出多个数据值

所以我们需要从一个可观测的数据中得到一个值,为此我们需要订阅它。 您可以使用for valueChanges调用文档,并按如下方式附加管道(take(1)),但是get()非常方便

   this.afs.doc(`users/${user.uid}`).valueChanges()
   .pipe(take(1))
   .subscribe(v => {
       console.log(v);
    });

如果您需要进一步的澄清,请告诉我。

事实上,这种
情况是因为登录的用户可能是制作人本身,那么
制作人
字段就不存在了。但是,我会更改它,并将字段放在那里进行测试。但它在查询时只返回一条记录,即登录的用户。实际上,这种情况是因为登录的用户可能是制作人本身,那么
producer
字段就不存在了。但是,我会更改它,并将字段放在那里进行测试。但它在查询时只返回一条记录,即登录用户。请显示您的数据库结构好吗?我的假设是,您没有查询正确的数据,因此无法获取特定生产者下的用户。如果您的数据如下所示:producers->producer->users->user{id and producerField},您可能需要查询producer集合以检索正确的producer文档,这将允许您访问其用户列表。@sllopis我刚刚添加了数据结构,我放入了两条记录,一个UID以“06”开头的用户是制作人,其他用户与他相关,在字段
produtor
中。请显示您的数据库结构好吗?我的假设是,您没有查询正确的数据,因此无法获取特定生产者下的用户。如果您的数据如下所示:producers->producer->users->user{id and producerField},您可能需要查询producer集合以检索正确的producer文档,这将允许您访问其用户列表。@sllopis我刚刚添加了数据结构,我放入了两条记录,其中一个UID以“06”开头的用户是制作人,其他用户与他有关联,在字段
produtor
中。