【问题标题】:Array-contains query not working react native [duplicate]包含数组的查询不起作用反应本机[重复]
【发布时间】:2019-12-06 09:33:49
【问题描述】:

您好,我正在实现包含数组的查询,但每次我尝试时都会得到空白快照。我的代码是:

getStation = () => {
  const query = firebase
     .firestore()
     .collection('routes')
     .where('station', 'array-contains', 'station_name ');

  query.get().then(snapshot => {
      console.log("snapshot", snapshot);

      snapshot.docs.forEach(doc => {
        alert("eri")
        console.log("eryh", doc.data);
      })
    })
    .catch(err => {
      console.log('Error getting documents', err);
    });

}

我什至尝试传递静态值但无法获得期望值。

【问题讨论】:

    标签: javascript google-cloud-firestore


    【解决方案1】:

    在你的代码中有一个错字错误站必须是站的问题

    .where('station', 'array-contains', 'station_name ');
    

    必须

     .where('stations', 'array-contains', 'station_name ');
    

    我希望它能解决你的问题。

    更新答案

    你刚刚在station_name后面添加空格的station_name也有拼写错误

    .where('station', 'array-contains', 'station_name ');
    

    必须

    .where('stations', 'array-contains', 'station_name');
    

    【讨论】:

    • 不..这不起作用。
    • 我已经更新了答案,请查看更新后的答案
    【解决方案2】:

    您正在尝试使用数组包含来检查地图中的字段。不支持。

    array-contains 只能搜索数组内的字段,而不是该数组内的映射内的字段。

    我测试过的解决方法是在数组中添加一个额外的字段,该字段将是布尔值或字符串,您可以根据它进行查询。

    在数组中使用布尔字段:

    .where('stations', 'array-contains', true);
    

    在数组中使用字符串字段:

    .where('stations', 'array-contains', 'station_name exists');
    

    【讨论】:

    • 你给出的为什么 OP 的代码不起作用的原因是正确的,但是你的解释有点不对劲,你的解决方法也不起作用。它实际上比您的解释更简单:array-contains 检查您指定的精确对象/值是否存在于数组中。它不能检查数组元素的子集,只能检查完整的值。
    • 您能否解释一下为什么您认为这些变通办法行不通?
    • 嗯...第二次阅读它可能确实有效。我被您现在在数组中拥有的混合类型所迷惑。我仍然建议不要以这种方式混合类型,因为它只会使调试和维护变得更加困难。分离出您要过滤的精确值是此用例更惯用的方法。
    • 我明白你的意思。我会记住这一点。
    【解决方案3】:

    array-contains 操作检查您指定的精确对象/值是否存在于数组中。它不能检查数组元素的子集,只能检查完整的值。因此,在您当前的结构中,您必须将所有属性传递给 array-contains 调用:

    .where('station', 'array-contains', 
      { station_address_name: '...', station_lat_long: ..., status_name: '...' });
    

    这通常是不可行的,在这种情况下,您需要将要过滤的元素存储在文档中的(附加)单独字段中。在此示例中,由于您要过滤电台名称,您将添加一个字段station_names,您只存储电台名称。然后你可以查询:

    .where('station_names', 'array-contains', 'name to search for')
    

    另见:

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2018-06-11
      • 2018-11-28
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      相关资源
      最近更新 更多