Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Indexes on firestore collections with the same name at different "paths"

In my firestore database, I use the same collection name in different parts of my hierarchy. For example, imagine a stackoverflow-like site with the following 2 collections

/questions/{questionId}/votes/ /questions/{questionId}/answers/{answerId}/votes/

So now I want to create an index on one of these 2 collections. I would expect firestore to require some kind of "path-with-wildcards" like I've used above to identify the data to be indexed. However, instead, they only require the collection name: in this case, "votes".

So if I put an index on "votes" does it apply to both of these collections? Is there any way to put an index on one of these collection and not the other? Is it a best practice to use unique collection names to avoid this issue?

like image 991
zevdg Avatar asked Jan 17 '18 20:01

zevdg


People also ask

What file should be used for firestore indexes firestore indexes JSON?

From the CLI, edit your index configuration file, with default filename firestore. indexes. json , and deploy using the firebase deploy command.

How do I use index in firestore?

Go to the Cloud Firestore section of the Firebase console. Go to the Indexes tab and click Add Index. Enter the collection name and set the fields you want to order the index by. Click Create.

Can you have a collection in a collection firestore?

A collection contains documents and nothing else. It can't directly contain raw fields with values, and it can't contain other collections. (See Hierarchical Data for an explanation of how to structure more complex data in Cloud Firestore.)


1 Answers

TL;DR:

Yes. Indexes are based on the collection id. This applies to both the ones we create automatically for you on single fields, as well as the composite indexes you create manually. If they are semantically different indexes we recommend you give them unique ids, so you could use question_votes and answer_votes.

More Info

Collection id is the identifier of the collection, excluding the full path. In your case, this is votes as you've noted.

The queries we currently serve use the subset of indexes for a specific path, although we have plans in the future to allow you to do a query that spans all collections with the same collection id (the collection group). This small bit of info adds some context to why.

A second reason is there is a 200 composite index limit in the system, so if someone had a data model structured like the following, /users/{user_id}/blog_posts/{post_id}, there would be no real way for them to create composite indexes on blog_posts for more than a handful of users (not to mention the operational burden of creating new indexes for every user!)

like image 126
Dan McGrath Avatar answered Nov 15 '22 17:11

Dan McGrath