programing

Firestore 문서에 타임스탬프 추가

randomtip 2023. 6. 10. 16:33
반응형

Firestore 문서에 타임스탬프 추가

저는 파이어스토어 신입사원입니다.소방서 문서에 따르면...

중요:Firebase Realtime Database의 "Push ID"와 달리 Cloud Firestore 자동 생성 ID는 자동 주문을 제공하지 않습니다.작성 날짜별로 문서를 정렬하려면 타임스탬프를 문서의 필드로 저장해야 합니다.

참조: https://firebase.google.com/docs/firestore/manage-data/add-data

키 을 키이름다같생이합니성까야해음과을?▁key합▁name니까▁as▁so▁create▁to로 만들어야 하나요?timestamp서류상으로는?또는createdFirestore 문서의 위 설명을 충족하면 충분합니다.

{
    "created": 1534183990,
    "modified": 1534183990,
    "timestamp":1534183990
}
firebase.firestore.FieldValue.serverTimestamp()

당신이 뭐라고 부르든 간에 페이크는 괜찮습니다.그러면 orderByChild('created')를 사용할 수 있습니다.

저도 주로 firebase.database를 사용합니다.서버 값.시간 설정 시 TIMESTAMP

ref.child(key).set({
  id: itemId,
  content: itemContent,
  user: uid,
  created: firebase.database.ServerValue.TIMESTAMP 
})

class, Firestore Timestamp를 합니다.firebase.firestore.Timestamp.now().

때부터firebase.firestore.FieldValue.serverTimestamp()에서 .add소방서에서 온 방법입니다.참조

파이어스토어용

ref.doc(key).set({
  created: firebase.firestore.FieldValue.serverTimestamp()
})

파이어스토어를 이용한 실시간 서버 타임스탬프

import firebase from "firebase/app";

const someFunctionToUploadProduct = () => {

       firebase.firestore().collection("products").add({
                name: name,
                price : price,
                color : color,
                weight :weight,
                size : size,
                createdAt : firebase.firestore.FieldValue.serverTimestamp()
            })
            .then(function(docRef) {
                console.log("Document written with ID: ", docRef.id);
            })
            .catch(function(error) {
                console.error("Error adding document: ", error);
            });

}

당신이 필요한 것은 'firebase'를 가져온 다음 firebase를 호출하기만 하면 됩니다.소방서FieldValue.serverTimestamp()는 필요한 위치에 있습니다.그러나 "serverTimestamp()"라는 철자는 주의해야 합니다.이 예에서는 Firestore의 제품 컬렉션에 업로드할 때 'createdAt'에 타임스탬프 값을 제공합니다.

맞습니다. 대부분의 데이터베이스와 마찬가지로 Firestore도 생성 시간을 저장하지 않습니다.시간별로 객체를 정렬하려면:

옵션 1: 클라이언트에 타임스탬프 생성(정확성이 보장되지 않음):

db.collection("messages").doc().set({
  ....
  createdAt: firebase.firestore.Timestamp.now()
})

여기서 가장 큰 경고는Timestamp.now()로컬 시스템 시간을 사용합니다.따라서 클라이언트 컴퓨터에서 실행되는 경우 타임스탬프가 정확하다는 보장은 없습니다.서버에서 설정하는 경우 또는 보장된 순서가 중요하지 않은 경우에는 문제가 없을 수 있습니다.

옵션 2: 타임스탬프 센티널을 사용합니다.

db.collection("messages").doc().set({
  ....
  createdAt: firebase.firestore.FieldValue.serverTimestamp()
})

타임스탬프 센티넬은 파이어스토어 서버에 첫 번째 쓰기 시 타임 서버 측을 설정하도록 알리는 토큰입니다.

Sentinel이 작성되기 전에(예: 청취자에서) 읽었을 경우 다음과 같이 문서를 읽지 않으면 NULL이 됩니다.

doc.data({ serverTimestamps: 'estimate' })

다음과 같은 방법으로 쿼리를 설정합니다.

// quick and dirty way, but uses local machine time
const midnight = new Date(firebase.firestore.Timestamp.now().toDate().setHours(0, 0, 0, 0));

const todaysMessages = firebase
  .firestore()
  .collection(`users/${user.id}/messages`)
  .orderBy('createdAt', 'desc')
  .where('createdAt', '>=', midnight);

로 이 로컬 시스템 을 사용합니다.Timestamp.now()). 하다면 Firebase의 Database이할 수

const serverTimeOffset = (await firebase.database().ref('/.info/serverTimeOffset').once('value')).val();
const midnightServerMilliseconds = new Date(serverTimeOffset + Date.now()).setHours(0, 0, 0, 0);
const midnightServer = new Date(midnightServerMilliseconds);

문서에 필드 이름이 나와 있지 않습니다.당신이 인용하는 부분은 단지 두 가지를 말하고 있는 것입니다.

  1. Firestore에 대해 자동으로 생성된 문서 ID는 Realtime Database에서와 같은 자연스러운 시간 기반 순서를 가지고 있지 않습니다.
  2. 시간 기반 순서를 지정하려면 문서에 타임스탬프를 저장한 후 쿼리 순서를 지정하는 데 사용합니다.(원하는 대로 부르셔도 됩니다.)

이 솔루션은 저에게 효과가 있었습니다.

Firestore.instance.collection("collectionName").add({'created': Timestamp.now()});

클라우드 Firestore의 결과: 클라우드 Firestore 결과

Swift 4 Timestamp(날짜: Date())에 대해 이것을 사용해 보십시오.

let docData: [String: Any] = [
"stringExample": "Hello world!",
"booleanExample": true,
"numberExample": 3.14159265,
"dateExample": Timestamp(Date()),
"arrayExample": [5, true, "hello"],
"nullExample": NSNull(),
"objectExample": [
    "a": 5,
    "b": [
        "nested": "foo"
    ]
]
]
db.collection("data").document("one").setData(docData) { err in
if let err = err {
    print("Error writing document: \(err)")
} else {
    print("Document successfully written!")
}
}

저와 함께 작동하는 방법은 스냅샷 매개 변수 snapshot.update에서 타임스탬프를 가져오는 것입니다.시간

exports.newUserCreated = functions.firestore.document('users/{userId}').onCreate(async (snapshot, context) => {
console.log('started!     v1.7');
const userID = context.params['userId'];

firestore.collection(`users/${userID}/lists`).add({
    'created_time': snapshot.updateTime,
    'name':'Products I ♥',
}).then(documentReference => {
    console.log("initial public list created");
    return null;
  }).catch(error => {
    console.error('Error creating initial list', error);
    process.exit(1);
});

});

문서에 따르면, "서버가 업데이트를 수신할 때 추적하는 서버 타임스탬프에 문서의 필드를 설정"할 수 있습니다.

예:

import { updateDoc, serverTimestamp } from "firebase/firestore";

const docRef = doc(db, 'objects', 'some-id');

// Update the timestamp field with the value from the server
const updateTimestamp = await updateDoc(docRef, {
    timestamp: serverTimestamp() // this does the trick!
});

파이어베이스 9+를 위해 2시간 동안 구글링 후 나에게 도움이 된 것을 공유합니다.

import { serverTimestamp } from "firebase/firestore";

export const postData = ({ name, points }: any) => {
  const scoresRef = collection(db, "scores");
  return addDoc(scoresRef, {
    name,
    points
    date: serverTimestamp(),
  });
};

저는 파이어스토어를 사용하여 Python과 함께 Raspass PI의 데이터를 저장하고 있습니다.파이프라인은 다음과 같습니다.

라즈베리 PI (paho-mqtt를 이용한 파이썬) -> 구글 클라우드 IoT -> 구글 클라우드 펍/서브 -> 파이어베이스 기능 -> 파이어스토어

장치의 데이터가 Python Dictionary입니다.저는 그것을 JSON으로 변환합니다.문제는 paho-mqtt가 String으로만 데이터를 전송(게시)하고 내 데이터 필드 중 하나가 timestamp라는 것입니다.이 타임스탬프는 데이터가 최종적으로 데이터베이스에 저장되는 시기에 관계없이 측정이 수행된 시기를 정확하게 알려주기 때문에 장치에서 저장됩니다.

제가 JSON 구조를 보낼 때, Firestore는 제 필드 '타임 스탬프'를 String으로 저장합니다.이것은 편리하지 않습니다.그래서 여기 해결책이 있습니다.

저는 변환할 모멘트 라이브러리를 사용하여 Firestore에 쓰기 위해 Pub/Sub에 의해 트리거되는 Cloud Function에서 변환을 수행합니다.

참고: 다음을 사용하여 파이썬으로 타임스탬프를 가져옵니다.

currenttime = datetime.datetime.utcnow()

var moment = require('moment'); // require Moment 
function toTimestamp(strDate){
  return parsedTime = moment(strDate, "YYYY-MM-DD HH:mm:ss:SS");
 }

exports.myFunctionPubSub = functions.pubsub.topic('my-topic-name').onPublish((message, context) => {

  let parsedMessage = null;
  try {
    parsedMessage = message.json;

    // Convert timestamp string to timestamp object
    parsedMessage.date = toTimestamp(parsedMessage.date);

    // Get the Device ID from the message. Useful when you have multiple IoT devices
    deviceID = parsedMessage._deviceID;

    let addDoc = db.collection('MyDevices')
                    .doc(deviceID)
                    .collection('DeviceData')
                    .add(parsedMessage)
                    .then ( (ref) => {
                      console.log('Added document ID: ', ref.id);
                      return null;
                    }).catch ( (error) => {
                      console.error('Failed to write database', error);
                      return null;
                    });

  } catch (e) {
    console.error('PubSub message was not JSON', e);
  } 

  // // Expected return or a warning will be triggered in the Firebase Function logs.
  return null;  
});

파이어스톤 방법이 작동하지 않습니다.java.sql의 타임스탬프를 사용합니다.타임스탬프를 기록하고 문자열에 캐스트하지 않습니다.그런 다음 파이어스톤 형식을 올바르게 지정합니다.now()를 표시하는 예는 다음과 같습니다.

val timestamp = Timestamp(System.currentTimeMillis())

Firestore에서 시간을 저장하는 여러 가지 방법

  1. firebaseAdmin.firestore.FieldValue.serverTimestamp() 될 때 됩니다.실제 타임스탬프는 문서가 Firestore에 기록될 때 계산됩니다.
    저장하는 동안 다음과 같이 나타납니다.

여기에 이미지 설명 입력

  1. firebaseAdmin.firestore.Timestamp.now()방법.
    저장하는 동안 다음과 같이 나타납니다.

여기에 이미지 설명 입력

두 가지 방법 모두 다음에 데이터를 가져올 때 Firestore Timestamp 개체를 반환합니다.

여기에 이미지 설명 입력

그래서 먼저 네이티브 js로 변환해야 합니다.Date객체를 사용하면 다음과 같은 방법을 수행할 수 있습니다.toISOString().

export function FStimestampToDate(
  timestamp:
    | FirebaseFirestore.Timestamp
    | FirebaseFirestore.FieldValue
): Date {
  return (timestamp as FirebaseFirestore.Timestamp).toDate();
}
  1. unix 타임스탬프로 저장Date.now번호로 저장됩니다. 1627235565028그러나 Firestore db에서는 읽을 수 있는 날짜로 볼 수 없습니다.
    이 Firestore 필드에 대해 쿼리하려면 날짜를 타임스탬프로 변환한 다음 쿼리해야 합니다.

  2. 다음으로 저장new Date().toISOString()예."2021-07-25T17:56:40.373Z"그러나 날짜 범위 쿼리를 수행할 수 없습니다.

저는 두 번째 또는 세 번째 방법을 선호합니다.

버전 9에서는 다음 가져오기만 사용합니다.

import { Timestamp } from '@angular/fire/firestore'

코드는 다음과 같습니다.

ref.child(key).set({
  id: itemId,
  content: itemContent,
  user: uid,
  createdAt: Timestamp.fromDate(new Date())
})

스위프트 5.1

...
"dateExample": Timestamp(date: Date()),
...

파이어스토어의 최신 버전은 다음과 같이 사용해야 합니다.

import { doc, setDoc, Timestamp } from "firebase/firestore"; 

const docData = {
    ...
    dateExample: Timestamp.fromDate(new Date("December 10, 1815"))
};
await setDoc(doc(db, "data", "one"), docData);

또는 중대한 타임스탬프의 경우

import { updateDoc, serverTimestamp } from "firebase/firestore";

const docRef = doc(db, 'objects', 'some-id');

const updateTimestamp = await updateDoc(docRef, {
   timestamp: serverTimestamp()
});

언급URL : https://stackoverflow.com/questions/51846914/add-timestamp-in-firestore-documents

반응형