'array-contains' 查询不适用于引用的 Firestore
Firestore where 'array-contains' query doesn't work with references
我有一个包含成员数组的集合 'chats',其中包含参与聊天的用户。问题是我想获取当前用户参与的所有聊天。
我用这个查询来做这个:
getUserChats(): Observable<Chat[]> {
return this.auth.currUser
.pipe(
take(1),
switchMap(user => this.afs
.collection('chats', ref => ref.where('members', 'array-contains', `/users/${user.uid}`))
.snapshotChanges()
.pipe(
map(actions => {
return actions.map(action => {
const data = action.payload.doc.data() as Chat;
const id = action.payload.doc.id;
return {id, ...data};
});
})
) as Observable<Chat[]>
)
);
}
这适用于字符串,但不适用于引用。我怎样才能让它也适用于参考资料?
绿色有效红色无效
绿色:字符串
红色:参考
它适用于字符串,因为您将以下参数作为第三个参数传递给 where()
函数:
/users/${user.uid}
它是字符串类型。如果您也想使用引用,而不是字符串,请传递一个实际的 DocumentReference 对象。
@Alex Mamo 回答正确,您需要一个 DocumentReference。
注意:您不能自己创建一个!
你必须通过查询firebase来获取引用!
代码:
return this.auth.currUser
.pipe(
take(1),
switchMap(user => this.afs
.collection('chats', ref => ref.where('members', 'array-contains', this.afs
.collection('users')
.doc<User>(user.uid)
.ref))
.snapshotChanges()
.pipe(
map(actions => {
return actions.map(action => {
const data = action.payload.doc.data() as Chat;
const id = action.payload.doc.id;
return {id, ...data};
});
})
) as Observable<Chat[]>
)
);
关键部分是 'value' 部分,即:
this.afs
.collection('users')
.doc<User>(user.uid)
.ref
您查询并THEN 获取带有 .ref 的引用!
就是这样!这就是您查询 DocumentReference 的方式!
我有一个包含成员数组的集合 'chats',其中包含参与聊天的用户。问题是我想获取当前用户参与的所有聊天。
我用这个查询来做这个:
getUserChats(): Observable<Chat[]> {
return this.auth.currUser
.pipe(
take(1),
switchMap(user => this.afs
.collection('chats', ref => ref.where('members', 'array-contains', `/users/${user.uid}`))
.snapshotChanges()
.pipe(
map(actions => {
return actions.map(action => {
const data = action.payload.doc.data() as Chat;
const id = action.payload.doc.id;
return {id, ...data};
});
})
) as Observable<Chat[]>
)
);
}
这适用于字符串,但不适用于引用。我怎样才能让它也适用于参考资料?
绿色有效红色无效
绿色:字符串 红色:参考
它适用于字符串,因为您将以下参数作为第三个参数传递给 where()
函数:
/users/${user.uid}
它是字符串类型。如果您也想使用引用,而不是字符串,请传递一个实际的 DocumentReference 对象。
@Alex Mamo 回答正确,您需要一个 DocumentReference。
注意:您不能自己创建一个!
你必须通过查询firebase来获取引用!
代码:
return this.auth.currUser
.pipe(
take(1),
switchMap(user => this.afs
.collection('chats', ref => ref.where('members', 'array-contains', this.afs
.collection('users')
.doc<User>(user.uid)
.ref))
.snapshotChanges()
.pipe(
map(actions => {
return actions.map(action => {
const data = action.payload.doc.data() as Chat;
const id = action.payload.doc.id;
return {id, ...data};
});
})
) as Observable<Chat[]>
)
);
关键部分是 'value' 部分,即:
this.afs
.collection('users')
.doc<User>(user.uid)
.ref
您查询并THEN 获取带有 .ref 的引用!
就是这样!这就是您查询 DocumentReference 的方式!