Luc*_*ild 17 javascript firebase google-cloud-firestore
我想查询firestore数据库中的文档ID.目前我有以下代码:
db.collection('books').where('id', '==', 'fK3ddutEpD2qQqRMXNW5').get()
Run Code Online (Sandbox Code Playgroud)
我没有得到结果.但是当我查询不同的字段时,它可以工作:
db.collection('books').where('genre', '==', 'biography').get()
Run Code Online (Sandbox Code Playgroud)
如何调用文档ID的名称?
Tha*_*you 51
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")
}
Run Code Online (Sandbox Code Playgroud)
这是基于firestore 文档中的示例
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!");
}
Run Code Online (Sandbox Code Playgroud)
你可以把它变成一个辅助函数
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")
Run Code Online (Sandbox Code Playgroud)
Den*_*nko 37
我有点晚了,但实际上有办法做到这一点
db.collection('books').where(firebase.firestore.FieldPath.documentId(), '==', 'fK3ddutEpD2qQqRMXNW5').get()
Run Code Online (Sandbox Code Playgroud)
当您处理firebase安全规则并且只想查询您允许访问的记录时,这可能很有用.
Sye*_*sim 36
虽然每个人都告诉使用.get(),这是完全合理的,但情况并非总是如此。
也许您想根据id(where例如使用查询)过滤数据。
这是在 Firebase v9 模块化 SDK 中执行此操作的方法:
import {collection, documentId} from 'firebase/firestore'
const booksRef = collection('books')
const q = query(booksRef, where(documentId(), '==', 'fK3ddutEpD2qQqRMXNW5'))
Run Code Online (Sandbox Code Playgroud)
Jür*_*ter 30
您可以使用__name__关键字在查询中使用您的文档 ID。
而不是这个db.collection('books').doc('fK3ddutEpD2qQqRMXNW5').get()你可以写
db.collection('books').where('__name__', '==' ,'fK3ddutEpD2qQqRMXNW5').get().
在这种情况下,您应该1返回一个长度数组。
firebase 文档在规则文档中提到了这个特性。https://firebase.google.com/docs/reference/rules/rules.firestore.Resource
Tod*_*man 22
试试这个:
db.collection('books').doc('fK3ddutEpD2qQqRMXNW5').get()
Run Code Online (Sandbox Code Playgroud)
(第一个查询正在寻找一个名为'id'的显式用户设置字段,这可能不是你想要的.)
Ven*_*kat 11
您可以通过id以下模式获取文档:
firebase
.firestore()
.collection("Your collection")
.doc("documentId")
.get()
.then((docRef) => { console.log(docRef.data()) })
.catch((error) => { })
Run Code Online (Sandbox Code Playgroud)
Elm*_*mar 11
如果您确实需要使用这种方式,目前只有云功能的工作方式:
// 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();
Run Code Online (Sandbox Code Playgroud)
更简单的方法是直接通过路径使用 ID 值,因为只有一个文档具有给定的文档 ID:
const targetUser = await db.doc("users/"+ "givenId").get();
Run Code Online (Sandbox Code Playgroud)
但是,如果您将给定的 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();
Run Code Online (Sandbox Code Playgroud)
最后一个例子来自这个讨论