2시간 이상 경과한 Firebase 데이터 삭제
2시간 이상 지난 데이터를 삭제하고 싶습니다.현재 클라이언트 측에서는 모든 데이터를 루프하여 오래된 데이터를 삭제합니다.이렇게 하면db.on('value')
함수는 삭제될 때마다 호출됩니다.또한 클라이언트가 접속할 때만 삭제되며, 2개의 클라이언트가 동시에 접속하면 어떻게 됩니까?
오래된 데이터를 삭제하는 설정은 어디에서 할 수 있습니까?JavaScript에 의해 작성된 각 오브젝트 내부에 타임스탬프가 있다.Date.now()
.
Firebase는 "2시간 전"과 같은 동적 매개 변수를 사용하는 쿼리를 지원하지 않습니다.그러나 "2015년 8월 14일 이후, 7:27:32 AM"과 같은 특정 값에 대한 쿼리를 실행할 수 있습니다.
즉, 코드 일부를 정기적으로 실행하여 2시간 이상 지난 항목을 정리할 수 있습니다.
var ref = firebase.database().ref('/path/to/items/');
var now = Date.now();
var cutoff = now - 2 * 60 * 60 * 1000;
var old = ref.orderByChild('timestamp').endAt(cutoff).limitToLast(1);
var listener = old.on('child_added', function(snapshot) {
snapshot.ref.remove();
});
아시겠지만 저는child_added
대신value
,그리고 나는.limitToLast(1)
내가 아이들을 하나씩 삭제하면, 파이어베이스가 발사할 것이다.child_added
컷오프 포인트 이후 항목이 더 이상 없을 때까지 새로운 "마지막" 항목에 대한 정보를 제공합니다.
업데이트: Firebase의 Cloud Functions에서 이 코드를 실행하려면:
exports.deleteOldItems = functions.database.ref('/path/to/items/{pushId}')
.onWrite((change, context) => {
var ref = change.after.ref.parent; // reference to the items
var now = Date.now();
var cutoff = now - 2 * 60 * 60 * 1000;
var oldItemsQuery = ref.orderByChild('timestamp').endAt(cutoff);
return oldItemsQuery.once('value', function(snapshot) {
// create a map with all children that need to be removed
var updates = {};
snapshot.forEach(function(child) {
updates[child.key] = null
});
// execute all updates in one go and return the result to end the function
return ref.update(updates);
});
});
이 함수는 데이터가 다음 위치에 기록될 때마다 트리거됩니다./path/to/items
자노드는데이터수정시에만삭제됩니다.
이 코드는 현재 repo에서도 사용할 수 있습니다.
노드가 생성된 시기와 만료 날짜에 따라 노드를 삭제하는 http 트리거 클라우드 기능이 있습니다.
데이터베이스에 노드를 추가할 때는 작성된 날짜를 알 수 있는 타임스탬프와 오퍼의 유효기간을 알 수 있는 기간이 필요합니다.
다음으로 http triggered cloud 함수가 있습니다.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
/**
* @function HTTP trigger that, when triggered by a request, checks every message of the database to delete the expired ones.
* @type {HttpsFunction}
*/
exports.removeOldMessages = functions.https.onRequest((req, res) => {
const timeNow = Date.now();
const messagesRef = admin.database().ref('/messages');
messagesRef.once('value', (snapshot) => {
snapshot.forEach((child) => {
if ((Number(child.val()['timestamp']) + Number(child.val()['duration'])) <= timeNow) {
child.ref.set(null);
}
});
});
return res.status(200).end();
});
X분마다 해당 함수의 URL에 대한 요청을 하는 cron 작업을 생성할 수 있습니다.https://cron-job.org/en/
단, 10초마다 요청을 하는 자체 스크립트를 실행하는 것이 좋습니다.
watch -n10 curl -X GET https://(your-zone)-(your-project-id).cloudfunctions.net/removeOldMessages
최신 버전의 Firebase API에서는 ref()가 ref로 변경되었습니다.
var ref = new Firebase('https://yours.firebaseio.com/path/to/items/');
var now = Date.now();
var cutoff = now - 2 * 60 * 60 * 1000;
var old = ref.orderByChild('timestamp').endAt(cutoff).limitToLast(1);
var listener = old.on('child_added', function(snapshot) {
snapshot.ref.remove();
});
만약 누군가 같은 문제를 겪게 된다면, 하지만 파이어스토어에서.처음에 console.log에 대한 문서를 읽은 후 24시간보다 오래된 컬렉션 메시지에서 문서를 삭제하는 스크립트를 실행했습니다.https://cron-job.org/en/을 사용하여 24시간마다 웹사이트를 갱신하는 것만으로 끝입니다.코드는 다음과 같습니다.
var yesterday = firebase.firestore.Timestamp.now();
yesterday.seconds = yesterday.seconds - (24 * 60 * 60);
console.log("Test");
db.collection("messages").where("date",">",yesterday)
.get().then(function(querySnapshote) {
querySnapshote.forEach(function(doc) {
console.log(doc.id," => ",doc.data());
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
db.collection("messages").where("date","<",yesterday)
.get().then(function(querySnapshote) {
querySnapshote.forEach(element => {
element.ref.delete();
});
})
Cron Jobs를 사용한 Firebase 함수 스케줄링에 대해 알아볼 수 있습니다.이 링크는 Firebase Cloud Function이 일정한 속도로 실행되도록 스케줄링하는 방법을 보여줍니다.예약된 Firebase 함수에서 이 스레드의 다른 응답을 사용하여 이전 데이터를 쿼리하고 제거할 수 있습니다.
언급URL : https://stackoverflow.com/questions/32004582/delete-firebase-data-older-than-2-hours
'programing' 카테고리의 다른 글
요청된 bean이 현재 생성 중입니다.해결할 수 없는 순환 참조가 있습니까? (0) | 2023.03.08 |
---|---|
MongoDB 색인된 컬럼의 count(구분 x) 선택 - 대용량 데이터 세트에 대한 고유 결과 카운트 (0) | 2023.03.08 |
스프링: 경로에 대한 /**와 /*의 차이 (0) | 2023.02.26 |
지시문의 scope.$watch가 AJAX 요청 후에 호출되지 않았습니다. (0) | 2023.02.26 |
href가 Angularjs 및 Twitter Bootstrap을 사용하여 의도하지 않은 페이지 새로고침을 일으킨다. (0) | 2023.02.26 |