#firebase #flutter #dart #google-cloud-firestore
#firebase #flutter #dart #google-cloud-firestore
Вопрос:
Итак, в моем облачном Firestore у меня есть коллекция рецептов, которая содержит документы (с случайными идентификаторами) с разными рецептами. В каждом документе есть 2 поля с названием рецепта и продолжительностью приготовления. У каждого документа также есть коллекция с именем likedBy, где есть документы, которые имеют идентификаторы пользователей as ids и имеют единственное поле с датой подобного. Теперь я хочу вернуть все рецепты, которые имеют в своей вложенной коллекции likedBy идентификатор пользователя. я напишу то, что я пробовал, используя только основной код.
String userId= 'uiuu4fn3fff4fu';
Scaffold(
body:StreamBuilder(
stream: THE STREAM THAT I NEED,
builder:(context,snapshot){
return ListView.builder(
itemCount: snapshot.data.documents.length
itemBuilder:(context,index){
return Column(children:[
Text(snapshot.data.documents[index]['recipeName']),
Text(snapshot.data.documents[index][recipeDuration]),]) } ) } ) )
Я хочу возвращать только документы, которые имеют в своей вложенной коллекции likedBy определенный пользовательский uid.
Я пробовал с этим потоком
Firestore.instance.collection('recipes').parent().collection('likedBy').where(FieldPath.documentId,
isEqualTo,userId).snapshots()
Но это не работает, и я понятия не имею, что еще я могу попробовать.
Любая помощь высоко ценится.
Элементы должны добавляться не пользователями, а администраторами, это означает, что будет список элементов, добавленных администраторами, и список пользователей, которые могут добавлять их в избранное, и я хочу добиться того, чтобы пользователи могли видеть все свои избранные в том порядке, в котором они их сохранили. Чтобы было ясно, я хочу что-то вроде Instagram для сохранения сообщений.
Ответ №1:
Итак, вам нужен способ запрашивать вложенную коллекцию. Для этого просто используйте метод collectionGroup:
db.collectionGroup('likedBy').where('userId', '==', '1');
Для упорядочивания по значению используйте временную метку:
// add to your document
db.collection("items")
.add({...item, created: firebase.firestore.Timestamp.fromDate(new Date()) })
и для упорядочивания по этому значению используйте orderby:
db.collection("items")
.orderBy("created", "asc")
Комментарии:
1. Таким образом, я могу возвращать данные только полей подборки likedBy, но то, что я хочу сделать, это вернуть все рецепты, которые имеют в своей подборке likedBy определенный идентификатор пользователя.
2. если это то, что вы хотите, то то, что сказал @Kris, является вашим лучшим решением. добавьте поле likedBy, представляющее собой массив пользователей, которым понравился этот рецепт, и запрашивайте их с помощью метода, содержащего массив. если вы хотите снова использовать array-contains, вам нужно выполнить другой запрос
3. Спасибо за ответ, но опять же я хочу показать рецепты в том порядке, в котором они были сохранены, используя временную метку и установив для данных значение DateTime.now() и упорядочить их по этому полю
4. вы можете использовать метод OrderBy
5. По какому полю я должен их упорядочить?
Ответ №2:
Вместо этого вы можете захотеть создать свойство ‘likedBy’ в документе рецепта вместо его собственной вложенной коллекции. Если это просто список идентификаторов пользователей, это не должно быть проблемой. Тогда вы можете просто сказать recipeCollection.где(likedBy, массив содержит: Идентификатор пользователя)
Комментарии:
1. спасибо за ответ, но я надеялся найти другое решение, поскольку мне нужен массив contains для фильтрации другого поля, а Cloud firestore не позволяет размещать более одного массива contains.
2. Я также надеялся найти решение, которое показывает рецепты на странице избранного в том порядке, в котором они были сохранены.