使用Firebase Cloud函数,我想在文档引用数组中搜索包含某个其他文档的文档。我的结构如下所示;
Users
name
email
cars
ref to cars/car1 for example
ref to cars/car2 for example
Cars
registration
make
model
有多个用户和多辆车。我需要搜索在他们的汽车阵列中有某个"汽车"的用户。
我正在尝试在一个Cloud函数中写这篇文章,并有以下内容;
admin.firestore()
.collection('users')
.where('cars', 'array-contains', registration)
.get().then(doc => {
console.log("TESTING: found the user " + doc.data().email)
return
}).catch(error => {
console.error(error);
});
我知道这目前只是在数组中搜索注册字符串。是否仍有搜索特定文档参考的功能。我正在使用Node.js.
获取数组中具有文档引用的所有文档的工作代码;
// Notify the owner of the car
admin.firestore()
.collection('users')
.where('cars', 'array-contains', carRef)
.get().then(snapshot => {
snapshot.forEach(doc => {
console.log("TESTING found the user " + doc.data().email);
const message = {
notification: {
body: 'Your vehicle (' + carReg + ') recieved a report. Tap here to see!',
},
token: doc.data().cloudMessagingToken
};
sendMessage(message);
});
return
}).catch(error => {
console.error("Error finding a user that has the car in their garage");
console.error(error);
});
如果要使用引用类型字段进行查询,则需要为查询提供DocumentReference类型对象。如果将DocumentReference传递给汽车,那么查询应该可以工作。例如:
const ref = admin.firestore().collection('Cars').doc(id)
其中CCD_ 1是文档的id。
但是,不能使用引用文档中字段的值进行搜索。Firestore查询一次只能针对单个集合中的数据。按照现在组织数据的方式,不可能对所有引用了具有特定注册字符串字段的汽车的用户进行单一查询。对于该查询,您还需要为每个用户存储一个注册字符串数组,您可以使用该数组包含的内容进行查询。
是的,这涉及到数据的重复,它被称为"非规范化"。这在nosql类型的数据库中非常常见,可以启用所需的查询。