你好,我正在实现包含数组的查询,但是每次我尝试获取空白快照时。我的代码是:
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);
});
}
答案 0 :(得分: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');
答案 1 :(得分:0)
您正在尝试使用数组包含的内容来检查地图内的字段。不支持。
包含数组的对象只能搜索数组内的字段,而不能搜索该数组内的映射内的字段。
我测试过的一种解决方法是,在数组内添加一个额外的字段,该字段将为布尔值或字符串,并且您可以基于该字段进行查询。
在数组中使用布尔字段:
.where('stations', 'array-contains', true);
在数组中使用字符串字段:
.where('stations', 'array-contains', 'station_name exists');
答案 2 :(得分:0)
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')
另请参阅: