javascript 在firebase中查询包含长度> 0的数组的文档

ldioqlga  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(117)

是否有可能在集合中查询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);
    });

});
f5emj3cl

f5emj3cl1#

这是不可能的与Firestore。对于数组类型字段,您唯一可以查询的是数组中某些元素的确切内容。
您对任何数组大小进行过滤的替代方法是使用整数字段来记录数组中的元素数量,并使其与该数组的更改保持同步。

pb3s4cty

pb3s4cty2#

FS中的索引是稀疏的,所以你可以简单地执行orderBy,只返回在ordered属性上填充了数据的文档:

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

zy1mlcev3#

我试图订购项目在我的Firestore回收商的大小阵列的人谁喜欢该项目。因为没有这样的特定查询函数,我创建了新字段"likesNum"。为了能够使用FieldValue.increment()使其与该数组的更改保持同步,字段类型必须是整数。
但是在.orderBy()中查询数字值字段会使我的应用程序崩溃。于是我试着:

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

和它的工作.虽然编译器说String.valueOF()是不必要的,但我的问题得到了完美的解决。
这可能会帮助有同样问题的人。

k5ifujac

k5ifujac4#

如果你试图根据collectionGroup中的数组长度进行过滤,你也可以使用!=运算符。范例:

const snapshot = await db.collectionGroup('users').where('people', '!=', []).get();

注意:不要忘记在你的Firestore索引规则中为collectionGroup(升序、降序或数组)添加豁免,否则你会得到Error: 9 FAILED_PRECONDITION

相关问题