查询Firebase中包含长度大于0的数组的文档。

15

在Firebase中,是否可以查询一个集合中某个字段的数组元素数量大于0的文档?

举个例子,每个文档都有一个名为“people”的字段,其中包含一个整数数组(或该数组为空)。

我的搜索总是返回0个文档,但是我在Firestore数据库管理面板中搜索时可以看到这些文档。

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
admin.initializeApp();

var db = admin.firestore();
export const helloWorld = functions.https.onRequest(function(req,res)
{
    var all_users = db.collection('users');
    var query = all_users.where("people.length", ">", 0).get().then(snapshot => 
    {
        let docs = snapshot.docs;

        //return 1st document found

        res.send(docs[0].data());
    });

    query.catch(error =>
    {
        res.status(500).send(error);
    });

});
4个回答

17

Firestore无法实现这一点。您只能查询数组类型字段中某个元素的确切内容。

如果要过滤任何数组的大小,您可以使用整数字段记录该数组中元素的数量,并确保其随着对该数组的更改而保持同步。


@GuilhermeFerreira 是正确的。我认为你误解了你回答中的查询实际上在做什么。在Firestore查询中,数组的长度是不可用的。 - Doug Stevenson
18
.where("myArray", "!=", []) 对我很有效。自那个回答以来,这个功能是否已经被添加了呢? - KnewB
3
Firestore如何执行不等于(不等)的查询?Firestore支持使用不等于运算符(! =)进行查询。要执行不等于查询,您可以使用以下代码:db.collection("collectionName").where("fieldName", "!=", value)其中,collectionName是集合名称,fieldName是字段名称,value是要匹配的不等于值。 - Doug Stevenson
3
我会在这里补充一点,Firestore 网页控制台只能对字符串、数字或布尔值运行一个“!=”操作符,所以我认为 "!=",[] 不起作用,但实际上是可以的 :) - KnewB
1
嗨,我刚找到了这个答案并尝试了.where('entries', isNotEqualTo: []),这对我来说可以让我略过'entries'为空的文档。根据您之前的回答,我不确定这是否会产生负面影响?@DougStevenson,您链接到另一个线程,我不知道您指的是什么。谢谢。 - railon
显示剩余4条评论

5
索引在文件系统中是稀疏的,所以您可以简单地按orderBy排序,仅返回具有已填充有序属性数据的文档。
.collection("users").orderBy("people", "asc")

完美!谢谢! - thecoolwinter
1
这将返回所有不包含“people”的文档,然后再返回包含“people”的文档。建议使用“desc”排序顺序以及.select('people'),然后遍历列表并保存文档ID,直到“people”为空为止。然后使用ID获取完整字段设置的文档。 - Viacheslav Dobromyslov

0

我试图通过Firestore Recycler的人数数组大小来对项目进行排序。因为没有这样特定的查询函数,我创建了新字段"likesNum"。为了能够使用FieldValue.increment()将其与对该数组的更改保持同步,字段类型必须是整数。

但在.orderBy()内查询数字值字段会导致我的应用程序崩溃。 所以我尝试了:

Query query = placesRef.orderBy( String.valueOf("likesNum"), Query.Direction.DESCENDING).limit(5);

它起作用了。虽然编译器说String.valueOF()不必要,但我的问题完美解决了。

也许这能帮助有同样问题的人。


0
如果你想根据集合组中的数组长度进行过滤,你也可以使用!=运算符。例如:
const snapshot = await db.collectionGroup('users').where('people', '!=', []).get();

注意:在您的Firestore索引规则中为collectionGroup(升序、降序或数组)添加例外,否则您将收到“错误:9 FAILED_PRECONDITION”的错误提示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接