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

时间:2019-03-21 19:18:14

标签: javascript google-cloud-firestore

是否可以查询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 个答案:

答案 0 :(得分:4)

在FS中,索引稀疏,因此您可以简单地执行orderBy,并且仅返回在ordered属性上具有填充数据的文档:

.collection("users").orderBy("people", "asc")

答案 1 :(得分:2)

这在Firestore中是不可能的。您只能查询数组类型字段的唯一内容是数组中某些元素的确切内容。

过滤任何数组大小的替代方法是使用整数字段来记录数组中元素的数量,并使它与对该数组的更改保持同步。

答案 2 :(得分:2)

编辑

不再工作。


旧答案

只有在您知道数组内部的内容(不知道是什么,只是对象的属性或原始类型)的情况下,凭某种想象力才有可能

让我们说每个人物对象都是{name:'...',age:'..'} 一个简单的查询将是:

firestore.collection('people').where('people.0.name','>','')

如果是基本类型

firestore.collection('people').where('people.0','>','')

这样,您将搜索具有第一项名称属性不为空的数组。 如果数组没有第一个属性,则为空。

重要提示::就像我说的那样,只有在您知道将存在哪种物体的情况下,

答案 3 :(得分:0)

我试图在我的 Firestore Recycler 中按喜欢该项目的人的数量来订购该项目。因为没有这样的特定查询函数,所以我创建了新字段 "likesNum"。为了能够使用 FieldValue.increment() 使其与对该数组的更改保持同步,字段类型必须是整数。

但是查询 .orderBy() 中的数值字段会导致我的应用程序崩溃。 所以我试过:

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

它奏效了。虽然编译器说 String.valueOF() 不是必需的,但我的问题完美解决。

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