我想从Firestore集合中选择仅由我写的文章。 这真的很难吗?
每篇文章都有字段“owner_uid”。
多数民众赞成:我只想写相当于"select * from articles where uid<>request.auth.uid"
答案 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)
在一个(或两个)文档中跟踪所有用户ID
过滤掉不需要的ID
使用“在哪里”
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(),