firestore 检查 id 是否存在于 id 数组中
firestore Check if id exists against an array of ids
我使用 firebase firestore 为我的网站开发了一个简单的聊天应用程序。每个聊天会话都有一个 id
假设我有一个 ID 数组
chat_sessions = ["q93XhadA9QQLu6X8yfZB", "YXEYISEI8b2iixCcP3VO", "GXrSZbtrmN5NcrtvjFYp"]
我想使用下面的代码获取 ID 等于 chat_sessions 对象中任何 ID 的所有文档。
return this.afs
.collection('chats', ref => ref.where('uid','in_array',chat_sessions)).snapshotChanges...
但我没有得到任何结果。
我来自 PHP/MYSQL 背景
在 PHP
中,PHP 相当于我想要实现的目标
if(in_array(uid,chat_sessions)){
get(doc/uid)
}
任何人都可以帮助我们根据数组中的 ID 列表检查文档 ID 的正确查询吗?谢谢!
您的查询是:
ref.where('uid','in_array',chat_sessions)
这会根据 chat_sessions
.
的值检查每个文档中名为 uid
的字段
您似乎想根据数组检查每个文档的 ID,您可以这样做:
ref.where(firebase.firestore.FieldPath.documentId(),'in_array',chat_sessions)
谢谢@frank van Puffelen。你几乎是对的。我应该使用 in
而不是 in_array
ref.where(firebase.firestore.FieldPath.documentId(),'in_array',chat_sessions)
没用。相反,我将 in_array
替换为 in
:
ref.where(firebase.firestore.FieldPath.documentId(),'in',chat_sessions)
这成功了!谢谢
我在 firestore 上找到了其他东西,即 "array-contains-any"
适合这种情况。
可能现在更新了。
更新
你好,firebase 最近做了一些更新,所以我找到了这个方法
`
const [products, setProduct] = useState([]);
const ids = ['H11LlJsh3sObwORZhA0b','om9m0lU9HYWyOJZKvEdi','1AoHyHuSFcF01zoyXyTD','6xoBlxsRXUoyzBUcWl0F',
'GJqthlmBGZaFAJqtC2jK','QNT3PxMfhNGg1RZnuqcq','RZgGoFZHyDAYaVZJWxGk','g4UO5P0EgtEqJnawwhXX','gyrZm8p0cEgJdDvTuB1g','mrscldfeYlkaSF151MpI',]
useEffect(() => {
const saveFirebaseTodos = [];
ids.forEach((element) => {
fetchMyAPI()
async function fetchMyAPI() {
const q = query(collection(db, "a"), where('__name__', '==', element));
const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
saveFirebaseTodos.push(({id: doc.id, ...doc.data()}));
/*console.log(doc.id, " => ", doc.data());*/
if (ids.length == saveFirebaseTodos.length) {
setProduct(saveFirebaseTodos)
}
});
}})
}, [])`
通过这种方式,您可以检查数组中有多少个元素(绕过 firebase 的 10 个元素限制)。
希望能帮到大家:D
我使用 firebase firestore 为我的网站开发了一个简单的聊天应用程序。每个聊天会话都有一个 id
假设我有一个 ID 数组
chat_sessions = ["q93XhadA9QQLu6X8yfZB", "YXEYISEI8b2iixCcP3VO", "GXrSZbtrmN5NcrtvjFYp"]
我想使用下面的代码获取 ID 等于 chat_sessions 对象中任何 ID 的所有文档。
return this.afs
.collection('chats', ref => ref.where('uid','in_array',chat_sessions)).snapshotChanges...
但我没有得到任何结果。
我来自 PHP/MYSQL 背景 在 PHP
中,PHP 相当于我想要实现的目标if(in_array(uid,chat_sessions)){
get(doc/uid)
}
任何人都可以帮助我们根据数组中的 ID 列表检查文档 ID 的正确查询吗?谢谢!
您的查询是:
ref.where('uid','in_array',chat_sessions)
这会根据 chat_sessions
.
uid
的字段
您似乎想根据数组检查每个文档的 ID,您可以这样做:
ref.where(firebase.firestore.FieldPath.documentId(),'in_array',chat_sessions)
谢谢@frank van Puffelen。你几乎是对的。我应该使用 in
而不是 in_array
ref.where(firebase.firestore.FieldPath.documentId(),'in_array',chat_sessions)
没用。相反,我将 in_array
替换为 in
:
ref.where(firebase.firestore.FieldPath.documentId(),'in',chat_sessions)
这成功了!谢谢
我在 firestore 上找到了其他东西,即 "array-contains-any"
适合这种情况。
可能现在更新了。
更新
你好,firebase 最近做了一些更新,所以我找到了这个方法
`
const [products, setProduct] = useState([]);
const ids = ['H11LlJsh3sObwORZhA0b','om9m0lU9HYWyOJZKvEdi','1AoHyHuSFcF01zoyXyTD','6xoBlxsRXUoyzBUcWl0F',
'GJqthlmBGZaFAJqtC2jK','QNT3PxMfhNGg1RZnuqcq','RZgGoFZHyDAYaVZJWxGk','g4UO5P0EgtEqJnawwhXX','gyrZm8p0cEgJdDvTuB1g','mrscldfeYlkaSF151MpI',]
useEffect(() => {
const saveFirebaseTodos = [];
ids.forEach((element) => {
fetchMyAPI()
async function fetchMyAPI() {
const q = query(collection(db, "a"), where('__name__', '==', element));
const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
saveFirebaseTodos.push(({id: doc.id, ...doc.data()}));
/*console.log(doc.id, " => ", doc.data());*/
if (ids.length == saveFirebaseTodos.length) {
setProduct(saveFirebaseTodos)
}
});
}})
}, [])`
通过这种方式,您可以检查数组中有多少个元素(绕过 firebase 的 10 个元素限制)。
希望能帮到大家:D