Firestore:如何执行不相等/不相等的查询



我只想从Firestore收藏中选择非我写的文章。
真的那么难吗?

每一篇文章都有字段"owner_uid";。

就是这样:
我只想写相当于"select * from articles where uid<>request.auth.uid"的东西

TL;DR:已找到解决方案:语言/平台的用法:https://firebase.google.com/docs/firestore/query-data/queries#kotlin+ktx_5

编辑2020年9月18日

Firebase的发行说明表明现在有not-in!=查询。(现在可以获得适当的文档。)

  • not-in查找指定字段值不在指定数组中的文档
  • !=查找指定字段的值不等于指定值的文档

两个查询运算符都不会匹配指定字段不存在的文档。请确保参阅文档以了解您的语言的语法。

原始答案

Firestore不提供不平等检查。根据文件:

where()方法接受三个参数:一个要筛选的字段、一个比较运算和一个值。该比较可以是<lt;=>,或者>=。

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

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

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

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

此外,有了它,您可以组合任何一组查询

对于web,有rxfire

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

更新Darren G的答案,导致">TypeError:将循环结构转换为JSON"。当我们执行筛选操作时,整个firebase对象被添加回数组,而不是只有数据。我们可以通过链接过滤器方法映射方法来解决这个问题

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

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

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

  2. 过滤掉不需要的识别码

  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)
let query = docRef.where('role','>',user_role).where('role','<',user_role).get()

这在字符串值为的消防仓库中不起"不相等"操作的作用

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

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

最新更新