查询文档 ID 的火灾恢复数据库

我想查询文档 ID 的火灾恢复数据库。目前我有以下代码:

db.collection('books').where('id', '==', 'fK3ddutEpD2qQqRMXNW5').get()

我没有得到结果,但是当我查询一个不同的字段时,结果是正确的:

db.collection('books').where('genre', '==', 'biography').get()

如何调用文档 id 的名称?

148760 次浏览

试试这个:

db.collection('books').doc('fK3ddutEpD2qQqRMXNW5').get()

(第一个查询是查找名为“ id”的显式用户集字段,这可能不是您想要的。)

你可以按照下面的模式通过 id得到一个文档:

firebase
.firestore()
.collection("Your collection")
.doc("documentId")
.get()
.then((docRef) => { console.log(docRef.data()) })
.catch((error) => { })

我迟到了一会儿,不过还是有办法的

db.collection('books').where(firebase.firestore.FieldPath.documentId(), '==', 'fK3ddutEpD2qQqRMXNW5').get()

当您处理 Firebase 安全规则并且只想查询允许访问的记录时,这可能很有用。

火灾恢复文档获取文档。

var docRef = db.collection("cities").doc("SF");


docRef.get().then(function(doc) {
if (doc.exists) {
console.log("Document data:", doc.data());
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
}).catch(function(error) {
console.log("Error getting document:", error);
});

可以使用 __name__关键字在查询中使用文档 ID。

代替这个 db.collection('books').doc('fK3ddutEpD2qQqRMXNW5').get()你可以写

db.collection('books').where('__name__', '==' ,'fK3ddutEpD2qQqRMXNW5').get().

在这种情况下,您应该得到一个长度为 1的数组。

Firebase 文档在规则文档中提到了这个特性

只是为了解释清楚

请记住,无论是获取完整的 collection还是单个 doc,都应该使用 async/await来获取数据。

async function someFunction(){
await db.collection('books').doc('fK3ddutEpD2qQqRMXNW5').get();
}

2021年6月

新的 V9模块化 sdk是可以动摇的,并且可以产生更小的编译应用程序。推荐所有新的 Firestore 应用程序使用它。

import { doc, getDoc } from "firebase/firestore";


const snap = await getDoc(doc(db, 'books', 'fK3ddutEpD2qQqRMXNW5'))


if (snap.exists()) {
console.log(snap.data())
}
else {
console.log("No such document")
}

这是基于来自 火灾恢复文件的例子

import { doc, getDoc } from "firebase/firestore";


const docRef = doc(db, "cities", "SF");
const docSnap = await getDoc(docRef);


if (docSnap.exists()) {
console.log("Document data:", docSnap.data());
}
else {
// doc.data() will be undefined in this case
console.log("No such document!");
}

你可以把它变成一个 helper 函数

async function getDocument (coll, id) {
const snap = await getDoc(doc(db, coll, id))
if (snap.exists())
return snap.data()
else
return Promise.reject(Error(`No such document: ${coll}.${id}`))
}


getDocument("books", "fK3ddutEpD2qQqRMXNW5")

虽然每个人都告诉使用 .get(),这是完全合理的,但并不总是如此。

也许您希望基于 id过滤数据(例如使用 where查询)。

这就是你在 Firebase v9模块化 SDK 中的做法:

import {collection, documentId} from 'firebase/firestore'


const booksRef = collection('books')


const q = query(booksRef, where(documentId(), '==', 'fK3ddutEpD2qQqRMXNW5'))

如果您正在寻找更多带有 helper 函数的动态查询,您可以简单地尝试这样做。

import { db} from '@lib/firebase';


import {query, collection, getDocs ,documentId } from "firebase/firestore";


const getResult = async (_value) => {
const _docId = documented()
const _query = [{
field: _docID,
operator: '==',
value: _value
}]
// calling function
const result = await getDocumentsByQuery("collectionName", qColl)
console.log("job result: ", result)
}


// can accept multiple query args
const getDocumentsByQuery = async (collectionName, queries) => {
const queryArgs = [];
queries.forEach(q => {
queryArgs.push(
where(q.field, q.operator, q.value)
);
});


const _query = query(collection(db, collectionName), ...queryArgs);
const querySn = await getDocs(_query);
   

const documents = [];
querySn.forEach(doc => {
documents.push({ id: doc.id, ...doc.data() });
});


return documents[0];
};

这是我在 Golang SDK 中寻找解决方案时出现的第一个链接,所以我将添加我的解决方案,以防其他人正在寻找它:

package main


import (
"context"
"fmt"
"log"


"cloud.google.com/go/firestore"
firebase "firebase.google.com/go/v4"
"google.golang.org/api/option"
)


type (
Car struct {
ID    string
Name  string  `firestore:"name"`
Make  string  `firestore:"make"`
Price float64 `firestore:"make"`
}
)


func main() {
ctx := context.Background()


// Use a service account
options := option.WithCredentialsFile("PATH/TO/SERVICE/FILE.json")


// Set project id
conf := &firebase.Config{ProjectID: "PROJECT_NAME"}


// Initialize app
app, err := firebase.NewApp(ctx, conf, options)
if err != nil {
log.Fatal(err)
}


// Get firestore client
client, err := app.Firestore(ctx)
if err != nil {
log.Fatal(err)
}
defer client.Close()


collectionRef := client.Collection("CAR_COLLECTION")


// firestore.DocumentID == "__name__"
docSnap, err := collectionRef.Where(firestore.DocumentID, "==", collectionRef.Doc("001")).Get(ctx)
if err != nil {
log.Fatal(err)
}


// Unmarshall item
car := Car{}
docSnap.DataTo(&car)
car.ID = docSnap.Ref.ID


// Print car list
fmt.Println(car)
}

目前,只有当你真正需要这样使用的时候,你才能使用云函数:

// Import firebase-admin
import * as admin from "firebase-admin";


// Use FieldPath.documentId()
admin.firestore.FieldPath.documentId()


const targetUser = await db.collection("users").where(admin.firestore.FieldPath.documentId() "==", "givenId").get();

更简单的方法是直接使用 ID 值 through path,因为只有一个文档具有给定的文档 ID:

const targetUser = await db.doc("users/"+ "givenId").get();

但是,如果要将给定的 ID 数组与 Firebase 集合进行匹配,您可能真的需要使用它,如下所示:

const admin = require("firebase-admin");


const arr = ["id1", "id2"];
const refArr = arr.map(id => admin.firestore().collection("media").doc(id));


const m = await admin
.firestore()
.collection("media")
.where(admin.firestore.FieldPath.documentId(), "in", refArr)
.get();

最后一个例子来自 这个讨论