Query Firestore by UserID and date range?
up vote
0
down vote
favorite
I need to query Firestore, but it keeps telling me I need an index. Problem is that isn't realistic, since EVERY user would require a custom index based on their UserId. For security, I can't allow anyone access unless canAccess.${userID} == true
as in the example below. But if I were to take ALL items, and filter them by date client-side I would be fetching hundreds of thousands of items every time I change the date range, so it isn't practical.
this.db.collection('items')
.where(`canAccess.${userId}`, '==', true)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
How would one going about fetching only the items they are allowed to access, and only between the chosen date range?
javascript google-cloud-firestore
add a comment |
up vote
0
down vote
favorite
I need to query Firestore, but it keeps telling me I need an index. Problem is that isn't realistic, since EVERY user would require a custom index based on their UserId. For security, I can't allow anyone access unless canAccess.${userID} == true
as in the example below. But if I were to take ALL items, and filter them by date client-side I would be fetching hundreds of thousands of items every time I change the date range, so it isn't practical.
this.db.collection('items')
.where(`canAccess.${userId}`, '==', true)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
How would one going about fetching only the items they are allowed to access, and only between the chosen date range?
javascript google-cloud-firestore
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I need to query Firestore, but it keeps telling me I need an index. Problem is that isn't realistic, since EVERY user would require a custom index based on their UserId. For security, I can't allow anyone access unless canAccess.${userID} == true
as in the example below. But if I were to take ALL items, and filter them by date client-side I would be fetching hundreds of thousands of items every time I change the date range, so it isn't practical.
this.db.collection('items')
.where(`canAccess.${userId}`, '==', true)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
How would one going about fetching only the items they are allowed to access, and only between the chosen date range?
javascript google-cloud-firestore
I need to query Firestore, but it keeps telling me I need an index. Problem is that isn't realistic, since EVERY user would require a custom index based on their UserId. For security, I can't allow anyone access unless canAccess.${userID} == true
as in the example below. But if I were to take ALL items, and filter them by date client-side I would be fetching hundreds of thousands of items every time I change the date range, so it isn't practical.
this.db.collection('items')
.where(`canAccess.${userId}`, '==', true)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
How would one going about fetching only the items they are allowed to access, and only between the chosen date range?
javascript google-cloud-firestore
javascript google-cloud-firestore
edited Nov 18 at 21:40
Frank van Puffelen
221k25362387
221k25362387
asked Nov 18 at 19:45
Jus10
1,46521038
1,46521038
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
You'll have to restructure your documents in order to perform this query. Consider putting the uids that can access the document in a field with a List type called canAccess
. Then query the list with array-contains
after you create an index on that field.
this.db.collection('items')
.where('canAccess', 'array-contains', userId)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
Oh I assumed querying an array would be just like querying an object in this situation (Would still need an index for array contents or something). Thanks! I'll give this a shot!
– Jus10
Nov 18 at 21:05
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
You'll have to restructure your documents in order to perform this query. Consider putting the uids that can access the document in a field with a List type called canAccess
. Then query the list with array-contains
after you create an index on that field.
this.db.collection('items')
.where('canAccess', 'array-contains', userId)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
Oh I assumed querying an array would be just like querying an object in this situation (Would still need an index for array contents or something). Thanks! I'll give this a shot!
– Jus10
Nov 18 at 21:05
add a comment |
up vote
1
down vote
accepted
You'll have to restructure your documents in order to perform this query. Consider putting the uids that can access the document in a field with a List type called canAccess
. Then query the list with array-contains
after you create an index on that field.
this.db.collection('items')
.where('canAccess', 'array-contains', userId)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
Oh I assumed querying an array would be just like querying an object in this situation (Would still need an index for array contents or something). Thanks! I'll give this a shot!
– Jus10
Nov 18 at 21:05
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
You'll have to restructure your documents in order to perform this query. Consider putting the uids that can access the document in a field with a List type called canAccess
. Then query the list with array-contains
after you create an index on that field.
this.db.collection('items')
.where('canAccess', 'array-contains', userId)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
You'll have to restructure your documents in order to perform this query. Consider putting the uids that can access the document in a field with a List type called canAccess
. Then query the list with array-contains
after you create an index on that field.
this.db.collection('items')
.where('canAccess', 'array-contains', userId)
.where('date', '>=', startDate)
.where('date', '<=', endDate);
answered Nov 18 at 20:28
Doug Stevenson
65.7k77997
65.7k77997
Oh I assumed querying an array would be just like querying an object in this situation (Would still need an index for array contents or something). Thanks! I'll give this a shot!
– Jus10
Nov 18 at 21:05
add a comment |
Oh I assumed querying an array would be just like querying an object in this situation (Would still need an index for array contents or something). Thanks! I'll give this a shot!
– Jus10
Nov 18 at 21:05
Oh I assumed querying an array would be just like querying an object in this situation (Would still need an index for array contents or something). Thanks! I'll give this a shot!
– Jus10
Nov 18 at 21:05
Oh I assumed querying an array would be just like querying an object in this situation (Would still need an index for array contents or something). Thanks! I'll give this a shot!
– Jus10
Nov 18 at 21:05
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53364788%2fquery-firestore-by-userid-and-date-range%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown