Javascript Firebase Cloud Firestore doc.data().includes或.IndexOf不';行不通
我正在尝试使用数组,尝试运行Javascript Firebase Cloud Firestore doc.data().includes或.IndexOf不';行不通,javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我正在尝试使用数组,尝试运行doc.data().includes和doc.data().indexOf在我存储在cloud firestore上的数组上,数组是文档中唯一存在的东西 数据是这样排列的 0: example@gmail.com 1: firebase@gmail.com 2: new@gmail.com 为了获取数据,我只需要 firebase.firestore().collection('mails').doc('emails').get().the
doc.data().includes
和doc.data().indexOf
在我存储在cloud firestore上的数组上,数组是文档中唯一存在的东西
数据是这样排列的
0: example@gmail.com
1: firebase@gmail.com
2: new@gmail.com
为了获取数据,我只需要
firebase.firestore().collection('mails').doc('emails').get().then((doc) => {
if (doc.exists) {
console.log(doc.data()); //prints the list of emails in form of array
doc.data().IndexOf(email); //error IndexOf doesn't exist
doc.data().includes(email); //error includesOf doesn't exist
}
else {
console.log('data doesn't exist');
}
});
要访问
doc.data().IndexOf
或doc.data()。包括或任何其他与数组相关的函数,只需将doc.data()
转换为如下数组:
var docArray = Object.values(doc.data());
docArray.includes(stringToSearchFor);
或
Object.values(doc.data())。包括(stringToSearchFor)代码>
这将允许您运行docArray.includes
和docArray.IndexOf
。转换的原因是firebase返回整个文档,它是对象的对象,您可以通过console.log(doc.data())和prototype字段看到这一点。这是因为firestore将数组存储为json对象,这意味着您看到的数组索引号实际上不是索引号,它们只是对象键
意义
0: example@gmail.com
1: firebase@gmail.com
2: new@gmail.com
其中0,1,2
是索引(或看起来的索引),而example@gmail.com, firebase@gmail.com, new@gmail.com
是值,但在firestore中,0,1,2
实际上只是键,它们不是索引。因此,要获取键(数字)或值(电子邮件),我们只需运行Object.keys(doc.data())//将返回数字或Object.values(doc.data())//将返回电子邮件,您将获得所需的数组,现在您可以在此数组上运行操作。访问doc.data().IndexOf
或doc.data()。包括
或任何其他与数组相关的函数,只需将doc.data()
转换为如下数组:
var docArray = Object.values(doc.data());
docArray.includes(stringToSearchFor);
或
Object.values(doc.data())。包括(stringToSearchFor)代码>
这将允许您运行docArray.includes
和docArray.IndexOf
。转换的原因是firebase返回整个文档,它是对象的对象,您可以通过console.log(doc.data())和prototype字段看到这一点。这是因为firestore将数组存储为json对象,这意味着您看到的数组索引号实际上不是索引号,它们只是对象键
意义
0: example@gmail.com
1: firebase@gmail.com
2: new@gmail.com
其中0,1,2
是索引(或看起来的索引),而example@gmail.com, firebase@gmail.com, new@gmail.com
是值,但在firestore中,0,1,2
实际上只是键,它们不是索引。因此,要获取键(数字)或值(电子邮件),我们只需运行Object.keys(doc.data())//将返回数字
或Object.values(doc.data())//将返回电子邮件,您将获得所需的阵列,现在您可以在此阵列上运行操作。我建议您将数据存储在阵列中,而不是Firestore数据库屏幕截图所示的单独字段中
Firestore文档当前包含6个不同的字段,使用doc.data()
可以将此文档中的所有6个字段作为一个JavaScript对象检索:这就是数组方法无法工作的原因。如果将此数据存储在一个数组中(即,一个数组类型的字段),则可以
您可以尝试以下代码:
const docRef = firebase.firestore().collection('mails').doc('emails');
docRef
.set({
mails: ['example@gmail.com', 'firebase@gmail.com', 'new@gmail.com'],
})
.then(() => {
return docRef.get();
})
.then((doc) => {
if (doc.exists) {
const email = 'example@gmail.com';
console.log(doc.data().mails);
console.log(doc.data().mails.indexOf(email));
console.log(doc.data().mails.includes(email));
}
});
我建议您将数据存储在数组中,而不是像Firestore数据库屏幕截图所示的单独字段中
Firestore文档当前包含6个不同的字段,使用doc.data()
可以将此文档中的所有6个字段作为一个JavaScript对象检索:这就是数组方法无法工作的原因。如果将此数据存储在一个数组中(即,一个数组类型的字段),则可以
您可以尝试以下代码:
const docRef = firebase.firestore().collection('mails').doc('emails');
docRef
.set({
mails: ['example@gmail.com', 'firebase@gmail.com', 'new@gmail.com'],
})
.then(() => {
return docRef.get();
})
.then((doc) => {
if (doc.exists) {
const email = 'example@gmail.com';
console.log(doc.data().mails);
console.log(doc.data().mails.indexOf(email));
console.log(doc.data().mails.includes(email));
}
});
你能显示数据库的屏幕截图吗(从Firebase控制台)?@RenaudTarnec在那里你能显示数据库的屏幕截图吗(从Firebase控制台)?@RenaudTarnec在那里你得到了一个很好的答案,是的,通常我是这样存储信息的,但后来我像这样存储了这个列表,遇到了对象问题,我找到了一个解决方案,可以轻松地处理您现有的任何数据,我想我应该分享我所做的,只是一点小技巧来克服这个问题,从firebase获取对象并尝试在其上运行数组操作,这是一个很好的答案,是的,通常我会这样存储信息,但后来我像这样存储了这个列表,遇到了对象问题,我找到了一个解决方案,可以轻松处理您现有的任何数据,我想我应该分享我所做的,为了克服这个问题,我们做了一点小改动,从firebase获取对象,然后尝试在其上运行数组操作