我刚开始使用Firebase。我正在寻找一种将数据推送到Firebase Firestore中的列表的方法。
我想要的结果如下图所示。当有新事务时,我需要使用新ID将其推送到“ packageTransactions”。我在文档中读到ID可以自动生成,并且是从时间戳派生的。这对我来说是完美的,因为订购很容易。
我尝试通过两种方式实现这一目标;
方法1:
return firebase.firestore()
.collection('packages')
.doc(`${parcelId}`)
.child("packageTransactions")
.push()
.set({"userId": user.uid, "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")})
这会产生错误:
[未处理的承诺被拒绝:TypeError:firebase.firestore()。collection('packages')。doc(“” + parcelId).child不是函数。 (在'firebase.firestore()。collection('packages')。doc(“” + parcelId).child(“ packageTransactions”)','firebase.firestore()。collection('packages')。doc(“” + parcelId).child'未定义)]
方法2:
var db= firebase.firestore();
var ref = db.ref(`packages/${parcelId}/`);
var transactRef = ref.child("packageTransactions");
transactRef.push().set({
"userId": user.uid,
"transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")
})
这会产生错误:*
[未处理的承诺被拒绝:TypeError:db.ref不是一个函数。 (在'db.ref(“ packages /” + parcelId +“ /”)'中,'db.ref'未定义)
图像中的updateCarrier函数起作用。我在使用pushCurrentHolder函数时遇到麻烦。
非常感谢任何人能提供帮助!预先感谢。
答案 0 :(得分:2)
您正在混淆Realtime Database和Firestore API。它们不是同一数据库,并且具有完全不同的API。
Firestore中没有push()
方法。也没有child()
方法。因此,这段代码毫无意义:
firebase.firestore()
.collection('packages')
.doc(`${parcelId}`)
.child("packageTransactions")
.push()
.set({"userId": user.uid, "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")})
如果要将文档添加到具有随机ID的软件包集合中,请执行以下操作:
firebase.firestore()
.collection('packages')
.doc(parcelId)
.add({"userId": user.uid, "transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")})
我确定这不会完全满足您的要求,但是您可以看到API的工作原理。
我强烈建议您回顾Firestore documentation for writing data以便更好地了解API。
答案 1 :(得分:1)
您正在混合Firebase实时数据库和Firestore,firestore中没有child()
方法:
var db= firebase.firestore();
var ref = db.collection("packages").doc(`${parcelId}`);
var transactRef = ref.collection("packageTransactions");
transactRef.add({
"userId": user.uid,
"transactionTime": moment().format("YYYY-MM-DD HH:mm:ss")
})
检查文档
https://firebase.google.com/docs/firestore/manage-data/add-data#web
答案 2 :(得分:1)
firestore
和realtime
的API不同。您正在混淆这两个API的方法。 push()
和child()
方法是realtime
API而非firestore
的API。要实现您想要的目标,请执行以下操作:
const db = firebase.firestore()
let transactRef = db.collection("packages")
.doc(parcelId)
.collection("packageTransactions")
transactRef.add({
userId: user.uid,
transactionTime: moment().format("YYYY-MM-DD HH:mm:ss")
})