使用ID查询Firebase Firestore文档

25
根据“Cloud Firestore数据模型”指南,每个文档都有一个名称。是否可以通过该文档标识符(即名称或ID)查询集合?例如,集合“Things”中的文档具有ID:0、1、2等。

enter image description here

是否可以查询ID小于100的文档?

3个回答

45

您可以使用特殊标记 FieldPath.documentId() 来按 documentId 进行查询,例如:

const querySnap = collection.where(firebase.firestore.FieldPath.documentId(), '<', '100').get();

请注意,文档ID是字符串,因此这将包括具有ID“0”或“1”的文档,但不包括'2',因为在字典顺序上'2'> '100'。

因此,如果您想进行数字查询,您需要将文档ID作为文档中的数字字段编写,然后对其进行普通查询。


2
有没有 Python 的等价物?我找不到它! - Aníbal Rivero
1
你知道在使用react-redux-firebasefirebaseConnect中是否有可能实现这个功能吗? - Blundering Philosopher
@BlunderingPhilosopher,你找到任何做到这一点的方法了吗? - leoxs
Angular - 确保要 import * as firebase from 'firebase/app'; - Jonathan
1
@AníbalRivero,他们添加了Python的等效代码,仍在测试中... google.cloud.firestore_v1.field_path.FieldPath.document_id() - sillo01
显示剩余2条评论

18

在Python中,您应该使用完整的文档名称。

from google.cloud import firestore
from google.cloud.firestore_v1.field_path import FieldPath

db = firestore.Client()
colRef = db.collection(u'docs')
filter = [db.document(u'docs/doc1'), db.collection(u'docs/doc3')]
query = colRef.where(FieldPath.document_id(), u'in', filter)

解决了我的问题。这种用法似乎没有其他文档记录。 - Josan
2
注意:in 过滤器只接受最多 10 个条目,否则会抛出错误,因此如果您在生产代码中使用,请做好准备... - bsplosion

1

我曾经为 Golang Firebase 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")
  
  // Create docment list of documents from "CAR_COLLECTION"
  var skipDocs []*firestore.DocumentRef
  idList := []string{"001", "002", "003"}
  for _, id := range idList {
    skipDocs = append(skipDocs, collectionRef.Doc(id))
  }

  // firestore.DocumentID == "__name__" 
  docs, err := collectionRef.Where(firestore.DocumentID, "not-in", skipDocs).Documents(ctx).GetAll()
  if err != nil {
    log.Fatal(err)
  }

  var carList []Car
  for _, doc := range docs {
    var car Car

    // Unmarshall item
    doc.DataTo(&car)
    car.ID = doc.Ref.ID

    // Add car to list
    carList = append(carList, car)
  }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接