How can I find data by multiple data as like as sql,Like I need to grab something Between date range where deliveryman===man,marchent===marchent,productStatus===status,Suppose I havent manId now so my query will return only data belongs to date range and matched with other conditions like marchent, productStatus, if i dont pass anything my query will return all data between selected date range. Date range will be available always, Thank you.
[{"pickup":false,"fee":88,"cost":0,"express":false,"returnReason":"","paid":false,"assigned":true,"_id":"5ff34e7f5dbbabb7b13828f4","orderid":"7dy3jl","description":"Laptop New Apple","receiverPhone":"01913198340","receiverName":"Masum","marchent":{"photo":"avatar.jpg","_id":"5fe9a35d1a92f45097499771","name":"Era","address":"Gulishtan","phone":"43535"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a19f70d2bd4ee06fe9a0","name":"Era","phone":"345345345"},"weight":1,"expressTime":"","receiverAddress":"Nikunjo2,Road3,House7","productStatus":"Delivered","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-04T17:21:03.426Z","updatedAt":"2021-01-07T17:14:43.100Z","__v":0},{"pickup":false,"fee":88,"cost":0,"express":false,"returnReason":"","paid":false,"assigned":true,"_id":"5ff34b586eb76bad64501559","orderid":"xx1wfo89","description":"Smart TV","receiverPhone":"01913198340","receiverName":"adsf","marchent":{"photo":"avatar.jpg","_id":"5fe9a35d1a92f45097499771","name":"Era","address":"Gulishtan","phone":"43535"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a14f70d2bd4ee06fe99f","name":"Raj","phone":"34354354"},"weight":1,"expressTime":"","receiverAddress":"asdf","productStatus":"in progress","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-04T17:07:36.351Z","updatedAt":"2021-01-07T18:44:27.695Z","__v":0},{"pickup":false,"fee":88,"cost":0,"express":false,"returnReason":"","paid":false,"assigned":true,"_id":"5ff34b307dca39ab609f5d23","orderid":"xx1wfo","description":"asdfasdf","receiverPhone":"01913198340","receiverName":"adsf","marchent":{"photo":"avatar.jpg","_id":"5fe9a35d1a92f45097499771","name":"Era","address":"Gulishtan","phone":"43535"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a14f70d2bd4ee06fe99f","name":"Raj","phone":"34354354"},"weight":1,"expressTime":"","receiverAddress":"asdf","productStatus":"Cancelled","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-04T17:06:56.656Z","updatedAt":"2021-01-07T17:14:57.078Z","__v":0},{"pickup":false,"fee":88,"cost":0,"express":false,"returnReason":"","paid":false,"assigned":true,"_id":"5ff3453e41ef4d995d392002","orderid":"osa7mj","description":"Khata Colom","receiverPhone":"01913198340","receiverName":"Masum","marchent":{"photo":"avatar.jpg","_id":"5fe9a35d1a92f45097499771","name":"Era","address":"Gulishtan","phone":"43535"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a14f70d2bd4ee06fe99f","name":"Raj","phone":"34354354"},"weight":1,"expressTime":"","receiverAddress":"Mohakhali dhaka","productStatus":"Delivered","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-04T16:41:34.041Z","updatedAt":"2021-01-07T15:11:27.359Z","__v":0},{"pickup":false,"fee":88,"cost":5000,"express":true,"returnReason":"","paid":false,"assigned":true,"_id":"5ff33dda15a2f69817cde3a8","orderid":"5iapq1","description":"Sauces","receiverPhone":"01913198340","receiverName":"Rezaul","marchent":{"photo":"avatar.jpg","_id":"5fe9a35d1a92f45097499771","name":"Era","address":"Gulishtan","phone":"43535"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a1f71a92f4509749976f","name":"masum","phone":"34534543"},"weight":1,"expressTime":"tomorrow 10 pm","receiverAddress":"Nikunju-2,Road 3","productStatus":"on the way","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-04T16:10:02.029Z","updatedAt":"2021-01-07T17:01:49.712Z","__v":0},{"pickup":false,"fee":88,"cost":500,"express":false,"returnReason":"not reachable","paid":false,"assigned":true,"_id":"5ff33d7215a2f69817cde3a6","orderid":"252d6g","description":"Pickle","receiverPhone":"01913198340","receiverName":"Masum","marchent":{"photo":"avatar.jpg","_id":"5fe9a35d1a92f45097499771","name":"Era","address":"Gulishtan","phone":"43535"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a1f71a92f4509749976f","name":"masum","phone":"34534543"},"weight":1,"expressTime":"","receiverAddress":"Nikunju2","productStatus":"return","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-04T16:08:18.481Z","updatedAt":"2021-01-07T17:15:16.026Z","__v":0},{"pickup":false,"fee":98,"cost":8000,"express":true,"returnReason":"","paid":false,"assigned":true,"_id":"5ff2f6c2652cf165286c1997","orderid":"iuc6l6","description":"Mango","receiverPhone":"01913198340","receiverName":"Raju","marchent":{"photo":"avatar.jpg","_id":"5fe9a3eb1a92f45097499773","name":"Lahore Shop","address":"Lahore, Dhaka","phone":"453453454"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a14f70d2bd4ee06fe99f","name":"Raj","phone":"34354354"},"weight":3,"expressTime":"at 10pm","receiverAddress":"Mohammadpur, dhaka","productStatus":"in progress","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-04T11:06:42.123Z","updatedAt":"2021-01-04T11:06:42.123Z","__v":0},{"pickup":false,"fee":88,"cost":3000,"express":false,"returnReason":"","paid":false,"assigned":true,"_id":"5ff225ba78249040b81ada0e","orderid":"b2ij9u","description":"Phone Pack edited","receiverPhone":"01913198340","receiverName":"Masum ed","marchent":{"photo":"avatar.jpg","_id":"5fe98c05a843743e86a7849f","name":"Mishu Fashion","address":"asdfasdf","phone":"3453454"},"deliveryman":{"photo":"avatar.jpg","_id":"5fe9a1f71a92f4509749976f","name":"masum","phone":"34534543"},"weight":1,"expressTime":"","receiverAddress":"Nikunju-2","productStatus":"Cancelled","hub":{"photo":"avatar.jpg","_id":"5fe75679e6f7a62ddaf5b2e9","name":"Admin"},"createdAt":"2021-01-03T20:14:50.431Z","updatedAt":"2021-01-04T10:15:04.842Z","__v":0}]
So I need All value if I do not pass any extra filter keyword except Date Range, But If I send filter keyword like Product Status "Delivered" Only Delivered Product will be shown by the given date range, If I send Merchent id then all products belongs to this Merchent will be given, If I send Deliveryman Id then product status and deliveryman filter will be work. Final think my search query will be work depends on my filter query, my filter query might be null. If it is null then this filter should not be work but the rest of filter will work
I have been trying to figure out a way to query a list of documents where I have a range filter on one field and order by another field which of course isn't possible, see my other question: Order by timestamp with range filter on different field Swift Firestore
But is it possible to save documents with the timestamp as id and then it would sort by default? Or maybe hardcode an ID, then retrieve the last created document id and increase id by one for the next post to be uploaded?
This shows how the documents is ordered in the collection
Any ideas how to store documents so they are ordered by created at in the collection?
It will order by document ID (ascending) by default in Swift.
You can use .order(by: '__id__') but the better/documented way is with FieldPath documentID() I don't really know Swift but I assume that it's something like...
.order(by: FirebaseFirestore.FieldPath.documentID())
JavaScript too has an internal variable which simply returns __id__.
.orderBy(firebase.firestore.FieldPath.documentId())
Interestingly enough __name__ also works, but that sorts the whole path, including the collection name (and also the id of course).
If I correctly understood your need, by doing the following you should get the correct order:
For each document, add a specific field of type number, called for example sortNbr and assign as value a timestamp you calculate (e.g. the epoch time, see Get Unix Epoch Time in Swift)
Then build a query sorted on this field value, like:
let docRef = db.collection("xxxx")
docRef.order(by: "sortNbr")
See the doc here: https://firebase.google.com/docs/firestore/query-data/order-limit-data
Yes, you can do this.
By default, a query retrieves all documents that satisfy the query in
ascending order by document ID.
See the docs here: https://firebase.google.com/docs/firestore/query-data/order-limit-data
So if you find a way to use a timestamp or other primary key value where the ascending lexicographical ordering is what you want, you can filter by any fields and still have the results sorted by the primary key, ascending.
Be careful to zero-pad your numbers to the maximum precision if using a numeric key like seconds since epoch or an integer sequence. 10 is lexicographical less than 2, but 10 is greater than 02.
Using ISO formatted YYYY-mm-ddTHH:MM:SS date-time strings would work, because they sort naturally in ascending order.
The order of the documents shown in the Firebase console is mostly irrelevant to the functioning of your code that uses Firestore. The console is just for browsing data, and that sorting scheme makes it relatively intuitive to find a document you might be looking for, if you know its ID. You can't change this sort order in the console.
Your code is obviously going to have other requirements, and those requirements should be coded into your queries, without regarding any sort order you see in the dashboard. If you want time-based ordering of your documents, you'll have to store some sort of timestamp field in the document, and use that for ordering. I don't recommend using the timestamp as the ID of a document, as that could cause problems for you in the future.