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

时间:2017-11-12 17:44:02

标签: firebase google-cloud-firestore

我想从Firestore集合中选择仅由我写的文章。 这真的很难吗?

  

每篇文章都有字段“owner_uid”。

多数民众赞成:我只想写相当于"select * from articles where uid<>request.auth.uid"

的东西

9 个答案:

答案 0 :(得分:32)

Firestore不提供不平等检查。根据{{​​3}}:

  

where()方法有三个参数:要过滤的字段,比较操作和值。比较可以是&lt;,&lt; =,==,&gt;或&gt; =。

不平等操作不像其他使用documentation的操作那样扩展。 Firestore索引适用于范围查询。对于这种类型的索引,对于不等式查询,后端仍然必须扫描集合中的每个文档以便得出结果,并且当文档数量变大时,这对性能非常不利。 / p>

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

您还可以选择使用多个查询来排除不同的值。像这样的东西,如果你想要除了12之外的所有东西。查询值&lt; 12,然后查询值&gt; 12,然后将结果合并到客户端。

答案 1 :(得分:3)

这是我如何解决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()过滤掉不需要的文档。它可以在服务器端或客户端运行。

答案 2 :(得分:2)

对于android系统,应该易于使用Task Api来实现。 新手示例:

    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
        }
    });

此外,您还可以结合任意一组查询。

对于网络来说,rxfire

答案 3 :(得分:0)

来自firebase文档

  

使用!=子句查询。在这种情况下,您应该拆分查询   进入大于查询和小于查询。例如,虽然   查询子句不支持(“age”,“!=”,“30”),你可以   通过组合两个查询获得相同的结果集,一个与子句相关   where(“age”,“&lt;”,“30”)和其中一个(“age”,“&gt;”,30)。

答案 4 :(得分:0)

let query = docRef.where('role','>',user_role).where('role','<',user_role).get()

在带字符串值的Firestore中,这不能用作“不等于”操作

答案 5 :(得分:0)

更新 Darren G 的答案,这导致“ TypeError:将圆形结构转换为JSON ”。当我们执行过滤操作时,整个firebase对象被添加回 array 而不是 just data 。我们可以通过链接过滤器方法和地图方法来解决此问题。

let articles = []
let articlesRefs = await db.collection('articles').get();

articles = articlesRefs.docs
           .filter((article) => article.data.uid !== request.auth.uid) //Get Filtered Docs
           .map((article) => article.data()); //Process Docs to Data

return articles

仅供参考:这是一项昂贵的操作,因为您将从数据库中获取所有文章,然后进行本地过滤。

答案 6 :(得分:0)

  1. 在一个(或两个)文档中跟踪所有用户ID

  2. 过滤掉不需要的ID

  3. 使用“在哪里”


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)

答案 7 :(得分:-1)

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

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

答案 8 :(得分:-1)

在 Flutter 和 Firestore 中执行不等式/不等式查询

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