This question already has answers here:
How to perform compound queries with logical OR in Cloud Firestore?
                                
                                    (7个答案)
                                
                        
                5个月前关闭。
            
        

我在Firebase Firestore上有一个项目,我想在同一个子集合下的两个文档之间执行复合查询。我已经创建了Firestore所需的索引,并且如果字段在同一文档中,查询将完美执行。

为了说明我的情况:

采用以下结构:

- Users (root collection)
  - User (document)
    - userId
    - username
    - ...
    --- Personalization (subcollection)
        --- Alerts (document)
            - myTags (array of strings)
            - ...
        --- Location (document)
            - region (string)
            - ...


我想执行一个查询,该查询首先验证用户region/Users/{userId}/Personalization/Location)是否等于参考值。如果是这样,我希望它验证数组myTags/Users/{userId}/Personalization/Alerts)是否包含某个标记。

这是我到目前为止可以获得的最接近的结果:

db.collectionGroup('Personalization').where('region', '==', 'California').where('myTags', 'array-contains', 'Macbook')
    .get().then(querySnapshot => {
        if (querySnapshot.empty) {
            console.log('Result is empty');
        } else {
            console.log('Result found. ', querySnapshot.size, ' result(s).');
        }
        querySnapshot.forEach(doc => {
            console.log(doc.id, ' => ', doc.data());
        });
    }).catch(error => {
        console.error(error);
    });


如果我的所有字段都在同一个文档下,则此查询非常有效,例如:

    --- Personalization (subcollection)
        --- Alerts (document)
            - myTags (array of strings)
            - region (string)
            - ...


另外,我可以使两个查询完全独立地工作,如下所示:

db.collectionGroup('Personalization').where('myTags', 'array-contains', 'Macbook').get().then(querySnapshot => {
    querySnapshot.forEach(element => {
        console.log('Search only by tag => ', element.id, ' => ', element.data());
    });


有没有一种方法可以使查询工作,同时仍在同一子集合下使用两个不同的文档,或者我必须使用同一文档进行复合查询?也许索引上有一些配置,或者类似的东西我也不知道,因为当您第一次尝试使用复合查询创建索引时,我只关注了Firebase为您提供的错误链接。

附加信息:


这段代码是为在Firebase Functions上部署而开发的,它会在我拥有的某个集合上每次发生onWrite事件时触发。


另外,如果有人知道Firestore上复合查询的一些好例子,我将不胜感激。我已经阅读了文档,还看到了Firebase团队的一些视频,解释了Firestore的工作原理,但是我感到缺少更复杂的示例来了解Firestore的工作原理。

最佳答案

.where('region', '==', 'California').where('myTags', 'array-contains', 'Macbook')定义的compound query将不会返回两个不同的文档。

如文档(上面的链接)中所述,此查询将仅返回与两个where子句(“逻辑AND”)匹配的文档。

如同一文档中所述:


  Cloud Firestore不支持以下类型的查询:
  
  
  ...
  逻辑或查询。在这种情况下,您应该为每个OR条件创建一个单独的查询,并将查询结果合并到您的应用中。
  ...
  




如您的问题下面的注释中所述,一种解决方案是在regions文档中添加一个额外的Alert字段。

关于javascript - 如何在Firestore的两个不同文档之间进行复合查询? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58673262/

10-12 00:32
查看更多