Как я могу обновить несколько документов в FireStore, используя одну транзакцию, которую я искал, но я не получил никаких ответов. Можно ли обновить несколько документов за одну транзакцию? Я знаю, что это может быть сделано путем пакетной записи.
Firestore транзакция обновления нескольких документов в одной транзакции
Ответ 1
Я понял, что мы можем использовать несколько ссылок внутри транзакции:
var userSuhail = db.collection("users").doc("suhail");
var userSam = db.collection("users").doc("sam");
var userJohn = db.collection("users").doc("john");
var userAlfred = db.collection("users").doc("Alfred");
var userAlfredDetails = db.collection('userdetails').doc('Alfred');
db.runTransaction(function (transaction) {
return transaction.get(userJohn).then(function (sDoc) {
var age = sDoc.data().age + 1;
transaction.set(userAlfred, {
name: 'Alfred',
age,
details: userAlfredDetails,
});
transaction.set(userAlfredDetails, {
address: 'Alfred Villa',
});
transaction.update( userJohn , { age, }, );
transaction.update( userSuhail , { age, }, );
transaction.update( userSam , { age, }, );
return age;
});
}).then(function (age) {
console.log("Age changed to ", age);
}).catch(function (err) {
console.error(err);
});
С помощью приведенного выше кода транзакция обновляет возраст всех пользователей.
Ответ 2
Подтверждение концепции:
var transaction = firestore.runTransaction( t => {
return t.get(eRef)
.then(snapshot => {
snapshot.forEach(doc => {
var employee = doc.data();
if(employee.status !== 'Off work') {
t.update(doc.ref, {
status: 'Off work',
returnTime: '8 am'
})
}
})
})
}).then(result => {
console.log('Transaction success!')
}).catch(err => {
console.log('Transaction failure: ', err)
});
Ответ 3
Вы можете использовать пакетный метод, который обеспечивает firebase. Вот как я использовал его для хранения массива объектов, создавая несколько документов во вновь созданной коллекции.
export const addCollectionAndDocuments = async (collectionKey, objectToAdd) => {
console.log(collectionKey, objectToAdd);
let collectionRef = firestore.collection(collectionKey);
const batch = firestore.batch();
objectToAdd.forEach(obj => {
const newDocRef = collectionRef.doc();
batch.set(newDocRef, obj);
});
return await batch.commit();
};
Ответ 4
Cloud Firestore имеет богатый набор возможностей для запросов к коллекциям как лучший способ получить несколько документов. Если ваши данные не структурированы таким образом, что эти запросы работают, вам необходимо получить документы по одному. т.е. если ваш объект имеет набор ключей для других объектов, нет никакого запроса, который работает, вам нужно получить их в цикле.
https://firebase.google.com/docs/firestore/query-data/queries
Нет (текущего) способа обновления нескольких документов за одну операцию с помощью firestore. Существует пакетное средство, которое позволяет обновлять несколько документов как одну атомную транзакцию для обеспечения целостности данных.
https://firebase.google.com/docs/firestore/manage-data/transactions
Если это не ответит на ваш вопрос, предоставьте более подробную информацию о том, что вы пытаетесь сделать, и о структуре ваших данных.
Ответ 5
вы можете использовать это = >
firestore.collection("YOUR_COLLECTION_PATH")
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
Также, если вы хотите сопоставить querySnapshot в массиве, вы можете сделать это следующим образом:
firestore.collection("YOUR_COLLECTION_PATH")
.get()
.then(function(querySnapshot) {
var arrayDocs = querySnapshot.docs.map(docData=>docData.data())
console.log(arrayDocs);
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
Информация находится на https://firebase.google.com/docs/firestore/query-data/get-data