Firebase无法查询数组

时间:2017-11-03 18:11:38

标签: objective-c swift firebase google-cloud-firestore

我从this post了解到,firestore查询目前不提供以下方案。给出这样的数据:

somecollection/somedoc:
    foos: [ { name:"foo" email:"foo@bar.com" }, ... ]
somecollection/someotherdoc:
    foos: [ { name:"bar" email:"bar@foo.com" }, ... ]

我无法编写如下查询:

FIRCollectionReference *ref = [defaultFirestore collectionWithPath:@"/somecollection"];
FIRQuery *query = [ref queryWhereField:@"foos.email" isEqualTo:@"foo@bar.com"];

另一个答案中的建议是使用值作为键来创建我想要查询的数组字段的映射。类似的东西:

somecollection/somedoc:
    foos: [ { name:"foo" email:"foo@bar.com" }, ... ]
    emails: { "foo@bar.com": true, ... }
somecollection/someotherdoc:
    foos: [ { name:"bar" email:"bar@foo.com" }, ... ]
    emails: { "bar@foo.com": true, ... }

现在我的查询是:

FIRCollectionReference *ref = [defaultFirestore collectionWithPath:@"/somecollection"];
FIRQuery *query = [ref queryWhereField:@"emails.foo@bar.com" isEqualTo:@(YES)];

但是这个查询没有返回任何文件,因为我认为,电子邮件地址不是地图密钥的良好语法。在其他潜在的噪音中,它包含一个点.,我担心它会以FIRQuery作为解引用运算符。

有人可以解释如何查询数组中的电子邮件(或任何其他似乎不适合作为地图中的键的对象)吗?

1 个答案:

答案 0 :(得分:0)

通过标题查看,我发现其中包含queryWhereFieldPath:isEqualTo:的各种查询,其中FIRFieldPath采用了FIRFieldPath *path = [[FIRFieldPath alloc] initWithFields:@[@"emails", @"foo@bar.com"]]; FIRQuery *query = [ref queryWhereFieldPath:path isEqualTo:@(YES)]; ,并且字段路径似乎是容忍的,否则将被视为分隔符字段名称。它很容易形成和使用如下:

An uncaught Exception was encountered

Type: Error

Message: Call to undefined method CI_Input::category()

Filename: C:\xampp\htdocs\pos\application\models\Category_model.php

Line Number: 23

Backtrace:

File: C:\xampp\htdocs\pos\application\controllers\Category.php
Line: 30
Function: create_category

File: C:\xampp\htdocs\pos\index.php
Line: 315
Function: require_once

所以,是的。但是,奇怪的是,这个看似成熟的数据库有类似玩具的查询语言。