Query Firestore by UserID and date range?
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 |
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 |
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 '18 at 21:40
Frank van Puffelen
235k29381407
235k29381407
asked Nov 18 '18 at 19:45
Jus10Jus10
1,74721346
1,74721346
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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 '18 at 21:05
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
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 '18 at 21:05
add a comment |
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 '18 at 21:05
add a comment |
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 '18 at 20:28
Doug StevensonDoug Stevenson
76k990111
76k990111
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 '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 '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 '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 '18 at 21:05
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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