gpt4 book ai didi

firebase - Flutter Firestore 查询 2 个集合

转载 作者:行者123 更新时间:2023-12-03 02:44:39 25 4
gpt4 key购买 nike

问题已更新

我将如何查询 2 个集合?我有一个愿望 list 集合,其中每个愿望 list 文档如下所示:

documentID: "some-wishlist-id",
modified: "1564061309920",
productId: "2tqXaLUDy1IjxLafIu9O",
userId: "0uM7Dt286JYK6q8iLFyF4tG9cK53"

以及一个产品集合,其中每个产品文档看起来像这样。愿望 list 集合中的 productId 将是产品集合中的文档 ID:
documentID: "2tqXaLUDy1IjxLafIu9O",
dateCreated: "1563820643577",
description: "This is a description for Product 9",
images: ["some_image.jpg"],
isNegotiable: true,
isSold: false,
rentPrice: 200,
sellPrice: 410,
title: "Product 9",
totalWishLists: 0,
userId: "0uM7Dt286JYK6q8iLFyF4tG9cK53"

注意:要清楚的是,wishlist 查询应该返回我需要迭代以检索产品的文档列表。

不确定在这种情况下我是否需要使用流或 future ,但这是我目前所拥有的:
Future<Product> getProduct(String documentId) {
return Firestore.instance
.collection(APIPath.products())
.document(documentId)
.get()
.then((DocumentSnapshot ds) => Product.fromMap(ds.data));
}

Query getWishListByUser(userId) {
return Firestore.instance
.collection(APIPath.wishlists())
.where('userId', isEqualTo: userId);
}

Future<List<Product>> getProductsWishList(userId) async {
List<Product> _products = [];

await getWishListByUser(userId)
.snapshots()
.forEach((QuerySnapshot snapshot) {
snapshot.documents.forEach((DocumentSnapshot snapshot) async {
Map<String, dynamic> map = Map.from(snapshot.data);
map.addAll({
'documentID': snapshot.documentID,
});

WishList wishList = WishList.fromMap(map);

await getProduct(wishList.productId).then((Product product) {
print(product.title); // This is printing
_products.add(product);
});
});
});

// This is not printing
print(_products);

return _products;
}

谢谢

最佳答案

对于任何数据库,您通常需要连接来自多个表的数据来构建 View 。

在关系数据库中,您可以通过使用 JOIN 子句,使用一条语句从这些多个表中获取数据。

但是在 Firebase(和许多其他 NoSQL 数据库)中,没有内置的方法来连接来自多个位置的数据。所以你必须在你的代码中做到这一点。

创建愿望 list 模型:

class Wishlist {

Wishlist({
this.id,
this.modified,
this.productId,
this.userId
});

final String id;
final String modified;
final String productId;
final String userId;

Wishlist.fromMap(json)
: id = json['id'].toString(),
modified = json['modified'].toString(),
productId = json['productId'].toString(),
userId = json['userId'].toString();
}

在您的 API 文件中,执行以下操作:
final Firestore _fireStore = Firestore.instance;    

getWishList(wishlistId) async {
return await _fireStore.collection('wishlists').document(wishlistId).get();
}

getProduct(productId) async {
return await _fireStore.collection('product').document(productId).get();
}

Future<List<Product>>getProductsWishList(wishlistId) async {

var _wishlists = null;
List<Product> _products = []; // I am assuming that you have product model like above

await getWishList(wishlistId).then((val) {
_wishlists = Wishlist.fromMap(val.data);

_wishlists.forEach((wish) {
await getProduct(wish.productId).then((product) {
_products.add(product));
});
});
});

return _products;
}

关于firebase - Flutter Firestore 查询 2 个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com