Вы должны использовать оператор array_contains
для фильтрации по значениям массива, см. https://firebase.google.com/docs/firestore/query-data/queries#array_membership.
Поэтому вы должны адаптировать свой код следующим образом:
//....
db.collection("memeInfo").where("usersLiked", "array-contains", doc.data().uid)
.get()
.then(function(querySnapshot) {...})
Дополнительное замечание: использование setTimeout()
для управления асинхронным аспектом запросов к Firestore не является правильным подходом (нет уверенности в том, что запрос будет выполнен менее чем за 500 мс). Вы должны управлять асинхронностью с помощью обещаний, возвращаемых методом get()
. В частности, поскольку вы запускаете несколько запросов параллельно (через ваши циклы), вам нужно использовать Promise.all()
.
ОБНОВЛЕНИЕ после вашего комментария. Вы можете использовать Promise.all()
следующим образом:
var liks = [];
var tempLiks = [];
db.collection('users')
.where('uid', '==', uid)
.get()
.then(function(querySnapshot) {
// Here the Promise returned by the get() method is fulfilled, so you do have the results of the query and you do'nt need to use setTimeout
var queries = [];
querySnapshot.forEach(function(doc) {
tempLiks = doc.data().yourLikes;
//We push each query to the queries array
queries.push(
db
.collection('memeInfo')
.where('usersLiked', '==', doc.data().uid)
.get()
);
});
//Then we call Promise.all()
return Promise.all(queries);
})
.then(function(results) {
//As explained in the doc "The returned promise is fulfilled with an array containing all the values of the iterable passed as argument (the queries array)."
//So result is an array of QuerySnapshots, since the get() method returns a QuerySnapshot
//Do whatever you want with the array
console.log(results);
results.forEach(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
//.....
});
});
});