Firebase Firestore:如何使用不等/不等于执行查询

Firebase Firestore:如何使用不等/不等于执行查询,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我想从Firestore收藏中选择不是我写的文章。 真的那么难吗 每篇文章都有“owner\u uid”字段 就是这样:我只想写一篇相当于“从uidrequest.auth.uid所在的文章中选择*” TL;灾难恢复:已找到解决方案:语言/平台的用法:编辑2020年9月18日 Firebase建议现在有不在和中=查询。(现已提供。) 不在查找指定字段值不在指定数组中的文档 =查找指定字段的值不等于指定值的文档 两个查询运算符都不会匹配指定字段不存在的文档。请确保参阅文档以了解您的语言的语法

我想从Firestore收藏中选择不是我写的文章。
真的那么难吗

每篇文章都有“owner\u uid”字段

就是这样:
我只想写一篇相当于
“从uidrequest.auth.uid所在的文章中选择*”


TL;灾难恢复:已找到解决方案:语言/平台的用法:

编辑2020年9月18日

Firebase建议现在有
不在
中=查询。(现已提供。)

  • 不在
    查找指定字段值不在指定数组中的文档
  • =查找指定字段的值不等于指定值的文档
两个查询运算符都不会匹配指定字段不存在的文档。请确保参阅文档以了解您的语言的语法

原始答案

Firestore不提供不平等性检查。根据报告:

where()方法接受三个参数:要筛选的字段、比较操作和值。比较可以是=

不等式运算不像其他使用。Firestore索引适用于范围查询。对于这种类型的索引,对于不平等查询,后端仍然必须扫描集合中的每个文档才能得出结果,当文档数量增加时,这对性能极为不利

如果您需要筛选结果以删除特定项,您仍然可以在本地执行此操作


您还可以选择使用多个查询排除不同的值。像这样的,如果你想要除12以外的所有东西。查询<12的值,然后查询>12的值,然后在客户端合并结果。

对于android,它应该很容易实现。 新手示例:

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    Query lessQuery = db.collection("users").whereLessThan("uid", currentUid);
    Query greaterQuery = db.collection("users").whereGreaterThan("uid", currentUid);
    Task lessQuery Task = firstQuery.get();
    Task greaterQuery = secondQuery.get();

    Task combinedTask = Tasks.whenAllSuccess(lessQuery , greaterQuery)
                             .addOnSuccessListener(new OnSuccessListener<List<Object>>() {
        @Override
        public void onSuccess(List<Object> list) {

            //This is the list of "users" collection without user with currentUid
        }
    });
FirebaseFirestore db=FirebaseFirestore.getInstance();
查询lessQuery=db.collection(“用户”)。其中lessthan(“uid”,currentUid);
Query greaterQuery=db.collection(“用户”)。其中大于(“uid”,currentUid);
Task lessQuery Task=firstQuery.get();
Task greaterQuery=secondQuery.get();
Task combinedTask=Tasks.whenAllSuccess(lessky,greaterQuery)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(列表){
//这是“用户”集合的列表,其中没有具有currentUid的用户
}
});
此外,您还可以使用它组合任何查询集。


对于web,有

让query=docRef.where('role','>',user_role)。where('role','这是我如何用JavaScript解决问题的一个示例:

let articlesToDisplay = await db
  .collection('articles')
  .get()
  .then((snapshot) => {
    let notMyArticles = snapshot.docs.filter( (article) => 
      article.data().owner_uid !== request.auth.uid
    )
    return notMyArticles
  })

它获取所有文档,并使用Array.prototype.filter()过滤掉不需要的文档。这可以在服务器端或客户端运行。

您可以在javascript代码中过滤对象数组

var data=[Object,Object,Object] // this is your object array
var newArray = data.filter(function(el) {
   return el.gender != 'Male';
});

更新Darren G的答案,导致“类型错误:将循环结构转换为JSON”。当我们执行筛选操作时,整个firebase对象被添加回数组,而不是仅添加数据。我们可以通过链接筛选方法映射方法来解决此问题。

let articles=[]
let articlesRefs=await db.collection('articles').get();
articles=articlesRefs.docs
.filter((article)=>article.data.uid!==request.auth.uid)//获取筛选的文档
.map((article)=>article.data());//将文档处理为数据
归还物品
仅供参考:这是一项花费不菲的操作,因为您将从数据库中获取所有文章,然后对其进行本地筛选

  • 跟踪单个(或两个)文档中的所有用户id

  • 过滤掉不需要的id

  • 使用“where in”


  • 在Flatter with Firestore中,执行一个不相等/不相等的查询,如下所示

              FirebaseFirestore
              .instance.collection("users")
              .where("uid", isNotEqualTo: auth.currentUser.uid)
              .snapshots(),
    

    本地但如何?如果收集“文章”我已经阅读了一万篇文章,这意味着我必须用翻页的疯狂次数查询这个集合,才能找到未读的文章。
    例如,如何只获取我还没有读过的文章?
    在我的用户Firestore文档中存储已读的文章ID将扩大我的用户文档,每个Firestore文档都有1个限制mb-有一天,我的用户文档中读取的\u文章\u ids Firestore数组将超过此阈值。
    太困惑了:(((如此令人恼火的缺乏基本功能让我后悔,我选择了Google Firebase作为BaaSThere's no Rebefields here.像任何nosql数据库一样,你必须学会如何以适合你预期查询的方式对数据建模。因此我制作了一个用于创建文章的应用程序。当我还没有找到任何解决方法时,我感到惊讶显示由其他用户创建的文章列表。本地筛选在百万篇(只有一篇!)文章中都是胡说八道^(我不认为链接。在哪里操作像OR逻辑,它应该是AND逻辑。所以这可能不起作用?你必须分别查询两个条件和联接结果,从而增加读取操作的数量,从口袋里掏钱将返回一个空列表。你在Firebase控制台中计算了从数据库读取的次数吗?我想我n通过这种方式,您总是读取所有的“atricles”db图形,然后才过滤项目-这对于大型图形大小的情况来说,服务器内存+cpu使用量太高了,如上所述,此解决方案读取集合中的所有文档。不适用于大型集合。您可以按日期进行过滤,以从(例如)上周获取文章这是最佳实践吗?如果我使用fireba的firestore分页适配器,还有什么其他解决方案
    
    var mylistofidwherenotme =  // code to fetch the single document where you tracked all user id, then filter yourself out
    
    
    database.collection("articles").where("blogId", "in", mylistofidwherenotme)
    
    
              FirebaseFirestore
              .instance.collection("users")
              .where("uid", isNotEqualTo: auth.currentUser.uid)
              .snapshots(),