Fixing Firebase Firestore Queries with firestore-db for web and react-native-firebase
Tags: firebase, javascript, reactnative, webdev
Published: 2022-08-19 20:29:38

## Motivation :
I have been working with firestore for almost 4 years now for Web and and Native apps with React Native and also been annoyed by few of the quarks of the firestore because I mainly used Mongodb or SQL.

- Channing every single condition with another where function
  Like : `dbref.where("name","==","John").where(....)` and so on and then orderBy for each one as well as limit.

- Everytime it returns you have to do `doc.data()` to get the actual data if It's an query then map each item and do `.data()` on them.

- Doing anykind of search is Nightmare doesn't supports full text search but partial search is also annoying.

## Solution:
  Firestore-db : A utility package for firebase firestore and react-native-firebase to perform firestore queries easily with syntax inspired by mongoose like find,fineOne and also enable limited search options aswell.

## Installation 

`npm install firestore-db`
or 
`yarn add firestore-db`

## Examples
importing queryBuilder  and creating an instance for web or node js
```javascript
import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
import { queryBuilder } from 'firestore-db';

const Users = queryBuilder(firebase.firestore().collection("users"));

```
for react native
```javascript
import firestore from '@react-native-firebase/firestore'; 
import { queryBuilder } from 'firestore-db';
const Users = queryBuilder(firebase.firestore().collection("users"));

```
###Queries
**find()** : find can take an object containing key value pair where query can be string, array or object with operator and value. the param bjects can also take orderBy and limit and returns and array of results no need to call data() functions to get the results.
ex :
```javascript
Users.find({
	firstName:"John",
	city :["New York","Los Angeles"],
	age : {">=",18},
	limit:10,
	orderBy:"createdAt",
	//or  orderBy: ['createdAt', 'asc']  // with acs/desc
	//or orderBy: [['userId', 'desc'], ['createdAt', 'asc']] // multiple orderby
	})

```

here are all available functions and request params 

| Function name  | Description                                           | Params                                              | Return                              |
| -------------- | ----------------------------------------------------- | --------------------------------------------------- | ----------------------------------- |
| `findOne()`    | returns First Matching result                         | same as `find()`                                    | object Ex: `{name:"",age:"",id:""}` |
| `findById()`   | Finds Matching doc with id                            | id                                                  | object Ex: `{name:"",age:"",id:""}` |
| `create()`     | Creates New Doc                                       | object Ex: `{name:"",age:"",}`                      | Resove/Reject                       |
| `update()`     | Updates Existing Doc                                  | id,updatedObject Ex: `"uudefdsds",{name:"",age:""}` | updatedObject                       |
| `deleteOne()`  | Delete one Doc with id                                | id Ex: `"uudefdsds"`                                | Resove/Reject                       |
| `deleteMany()` | Deletes all docs from list of ids                     | Array Ex: `[id1,id2,...]`                           | Resove/Reject                       |
| `search()`     | Simple Text Search with matching Prefix or Whole Text | key and searchterm Ex: `"name","Joh"`               | updatedObject                       |




Thanks for reading try it out once.