查询firestore数据库以获取文档ID

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)

  • `db` 是对 firestore 数据库的引用。您可以在[入门文档](https://firebase.google.com/docs/firestore/quickstart?authuser=1)中了解如何初始化firestore (3认同)

Den*_*nko 37

我有点晚了,但实际上有办法做到这一点

db.collection('books').where(firebase.firestore.FieldPath.documentId(), '==', 'fK3ddutEpD2qQqRMXNW5').get()
Run Code Online (Sandbox Code Playgroud)

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

  • 完美的。我将其用于 `.where(firebase.firestore.FieldPath.documentId(), "in", listOfReferences)`。 (38认同)
  • 在 Flutter 中: firestore.collection("collection_name").where(FieldPath.documentId, whereIn: mList).getDocuments(); (4认同)
  • 如果其他人正在努力寻找此导入,请使用“import { firestore } from 'firebase';” (3认同)
  • 这太棒了。你在哪里看到这个? (3认同)
  • 你能说明 firebase.firestore.FieldPath 是从什么初始化的吗? (2认同)

Sye*_*sim 36

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

也许您想根据idwhere例如使用查询)过滤数据。

这是在 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'的显式用户设置字段,这可能不是你想要的.)

  • 如果我们需要多个where大小写(多个id)怎么办? (10认同)
  • 在 python 中,我得到`AttributeError: 'CollectionReference' object has no attribute 'doc'`。结果语法是 `db.collection('books').document('longid').get()` (9认同)
  • 嘿,您知道如何获取符合Firestore查询中提到的某些条件的文档ID (2认同)

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)

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