用Firestore检查一个id是否存在于一个id数组中

3
我正在使用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中应该是这样的:

if(in_array(uid,chat_sessions)){
      get(doc/uid)
      }

有谁能帮忙提供正确的查询语句,以便我们检查文档ID是否在一个数组中的ID列表中?谢谢!

5个回答

9

谢谢 @frank van Puffelen。你几乎是正确的。我应该使用 in 而不是 in_array

ref.where(firebase.firestore.FieldPath.documentId(),'in_array',chat_sessions)

原本不起作用。相反我用in代替了in_array

ref.where(firebase.firestore.FieldPath.documentId(),'in',chat_sessions)

这个方法起作用了!谢谢


7

您的查询如下:

ref.where('uid','in_array',chat_sessions)

这会检查每个文档中名为 uid 的字段与 chat_sessions 的值进行比较。

相反,您似乎想要将每个文档的ID与数组进行比较,可以使用以下方法:

ref.where(firebase.firestore.FieldPath.documentId(),'in_array',chat_sessions)

在v9中,针对文档ID进行测试的等效方法是什么?firebase.google.com/docs/reference/js/firestore_.fieldpath似乎不是正确的选择... - Georgy K
2
找到了:import {documentId} from "firebase/firestore"; ...where(documentId(), 'in', chat_sessions) https://firebase.google.com/docs/reference/js/firestore_#documentid - Georgy K

3

我在Firestore上发现了另一种方法,即"array-contains-any"

也许现在已经更新了。

Firestore condition


array_contains_any已经被添加到最近的Firestore更新中。虽然在提问时它还不可用,但现在可以将其作为答案接受,因为它现在可以工作。谢谢Kumar。 - MJ Nkunim

0

更新

你好,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


0
现在是2023年,今天你可以轻松地做到以下事情:
import { doc, documentId, onSnapshot, query, where } from 'firebase/firestore'

const partnerCandidatesQuery = query(
  usersCollection,
  where('role', '==', 'candidate'),
  where(
    documentId(),
    'in',
    candidateIds.map((id) => doc(usersCollection, id)),
  ),
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接