在 Firebase Firestore 中映射集合快照项
Posted
技术标签:
【中文标题】在 Firebase Firestore 中映射集合快照项【英文标题】:Map items of collection snapshot in Firebase Firestore 【发布时间】:2018-03-18 18:01:28 【问题描述】:Firebase Firestore Guides 展示如何使用forEach
在集合快照中迭代文档:
db.collection("cities").get().then(function(querySnapshot)
querySnapshot.forEach(function(doc)
console.log(doc.id, " => ", doc.data());
);
);
我以为它也会支持map
,但事实并非如此。如何映射快照?
【问题讨论】:
如果他们不支持所有的 Array.prototype 方法,我觉得他们不应该打开这罐蠕虫 【参考方案1】:你可以试试这个
FirebaseFirestore.instance
.collection('Video_Requests')
.get()
.then((QuerySnapshot querySnapshot)querySnapshot.docs.forEach((doc)
print(doc.data());
);
);
【讨论】:
【参考方案2】:// https://firebase.google.com/docs/firestore/query-data/get-data
const querySnapshot = await db.collection("students").get();
// https://firebase.google.com/docs/reference/js/firebase.firestore.QuerySnapshot?authuser=0#docs
querySnapshot.docs.map((doc) => ( id: doc.id, ...doc.data() ));
【讨论】:
正是我正在寻找的答案。谢谢!祝你有美好的一天:)【参考方案3】:我发现使用 map 并获取您的文档 ID 的更好方法如下:
从我希望在构造函数中更新的对象数组开始:
this.state =
allmystuffData: [
id: null,LO_Name: "name", LO_Birthday: seconds: 0, nanoseconds: 0,
LO_Gender: "Gender", LO_Avatar: "https://someimage", LO_Type: "xxxxx",],
;
在我的函数中执行以下操作
const profile = firebase
.firestore()
.collection("users")
.doc(user.uid)
.collection("stuff")
.get()
.then( async (querySnapshot) =>
console.log("number of stuff records for ",user.uid," record count is: ",
querySnapshot.size);
const profile = await Promise.all(querySnapshot.docs.map( async (doc) =>
const stuffData = doc.data()
stuffData.id = doc.id
condole.log("doc.id => ",doc.id)
return stuffData
));
this.setState(allmystuffData: profile);
)
.catch(function (error)
console.log("error getting stuff: ", error);
)
在此示例中,我使用查询快照读取集合中的所有文档,并在它们之间进行映射。 promise.all 确保在将所有记录呈现到屏幕之前返回所有记录。我将文档 id 添加到返回数组中每个对象的“id”元素中,然后使用 setstate 将我的状态数组替换为查询返回的数组。
【讨论】:
【参考方案4】:厌倦了 Firestore 在他们的课堂上返回东西或其他什么。这是一个助手,如果你给它一个db
和collection
,它将返回该集合中的所有记录作为解析实际数组的承诺。
const docsArr = (db, collection) =>
return db
.collection(collection)
.get()
.then(snapshot => snapshot.docs.map(x => x.data()))
;(async () =>
const arr = await docsArr(myDb, myCollection)
console.log(arr)
)()
【讨论】:
好帮手!我也会添加 idsnapshot.docs.map(x => x.id, ...x.data())
【参考方案5】:
这是另一个例子
var favEventIds = ["abc", "123"];
const modifiedEvents = eventListSnapshot.docs.map(function (doc)
const eventData = doc.data()
eventData.id = doc.id
eventData.is_favorite = favEventIds.includes(doc.id)
return eventData
)
【讨论】:
【参考方案6】:答案是:
querySnapshot.docs.map(function(doc)
# do something
)
The Reference page for Firestore 显示快照上的docs
属性。
docs non-null 非空 firebase.firestore.DocumentSnapshot 数组
QuerySnapshot 中所有文档的数组。
【讨论】:
在 Cloud Firestore querySnapshot documentation 中,'docs' 属性似乎变成了 'documents'。 @ArseneLupin 做documents
支持.map
或.forEach
?
我已经成功使用了.forEach。直觉说 .map 应该在 List.forEach()
实际上会返回DocumentSnapshot
s,而.docs.map()
只会返回QueryDocumentSnapshot
,然后您必须运行get()
。
It is docs
以上是关于在 Firebase Firestore 中映射集合快照项的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Firestore toObject 在布尔属性映射上失败