\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{john2222} \pdfinfo{ /Title (angular-firebase.pdf) /Creator (Cheatography) /Author (john2222) /Subject (angular-firebase Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{FF913D} \definecolor{LightBackground}{HTML}{FFF8F2} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{angular-firebase Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{john2222} via \textcolor{DarkBackground}{\uline{cheatography.com/114189/cs/21710/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}john2222 \\ \uline{cheatography.com/john2222} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Not Yet Published.\\ Updated 2nd February, 2020.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{3} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Toogller}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{\textless{}nav class="navbar navbar-expand-lg navbar-dark bg-dark"\textgreater{} \newline \textless{}a class="navbar-brand" href="\#"\textgreater{} \newline Brand \newline \textless{}/a\textgreater{} \newline \textless{}button class="navbar-toggler" type="button" \newline (click)="toggleNavbar()"\textgreater{} \newline \textless{}span class="navbar-toggler-icon"\textgreater{}\textless{}/span\textgreater{} \newline \textless{}/button\textgreater{} \newline \textless{}div class="collapse navbar-collapse" \newline {[}ngClass{]}="\{ 'show': navbarOpen \}"\textgreater{} \newline \textless{}ul class="navbar-nav mr-auto"\textgreater{} \newline \textless{}li class="nav-item"\textgreater{} \newline \textless{}a class="nav-link" href="\#"\textgreater{}Item 1\textless{}/a\textgreater{} \newline \textless{}/li\textgreater{} \newline \textless{}li class="nav-item"\textgreater{} \newline \textless{}a class="nav-link" href="\#"\textgreater{}Item 2\textless{}/a\textgreater{} \newline \textless{}/li\textgreater{} \newline \textless{}/ul\textgreater{} \newline \textless{}/div\textgreater{} \newline \textless{}/nav\textgreater{} \newline -{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-- \newline navbarOpen = false; \newline toggleNavbar() \{ \newline this.navbarOpen = !this.navbarOpen; \newline \}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Document}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{getProduct(id: number): Observable\textless{}Product\textgreater{} \{ \newline const productsDocuments = this.db.doc\textless{}Product\textgreater{}('products/' + id); \newline return \seqsplit{productsDocuments.snapshotChanges()} \newline .pipe( \newline map(changes =\textgreater{} \{ \newline const data = changes.payload.data(); \newline const id = changes.payload.id; \newline return \{ id, ...data \}; \newline \})) \newline \}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Collection}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{getProduct(id: string): Observable\textless{}Product{[}{]}\textgreater{} \{ \newline const productsDocuments = this.db.collection\textless{}Product{[}{]}\textgreater{}('products'); \newline return \seqsplit{productsDocuments.snapshotChanges()} \newline .pipe( \newline map(changes =\textgreater{} changes.map((\{ payload: \{ doc \} \}) =\textgreater{} \{ \newline const data = doc.data(); \newline const id = doc.id \newline return \{ id, ...data \}; \newline \})), \newline map((products) =\textgreater{} products.find(doc =\textgreater{} doc.id === id))) \newline \}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Add/Create A Document To Cloud Firestore}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{const db = firebase.firestore() \newline db.collection("users").add(\{ \newline name: "Anbu Selvan", \newline email: "anbu.selvan@email.com", \newline age: 25 \newline \} \newline \newline db.collection("users") \newline .doc() \newline .set(\{ \newline name: "Anbu Selvan", \newline email: "anbu.selvan@email.com", \newline age: 25 \newline \})} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Update A Document Data to Cloud Firestore}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{db.collection("users") \newline \seqsplit{.doc("3P86VJxcpBK0D0lsAyYx")} \newline .set(\{ \newline name: "Lee Kuan", \newline \}); \newline \newline db.collection("users") \newline .doc("3P86VJxcpBK0D0lsAyYx") \newline .set( \newline \{ \newline name: "Anbu Selvan", \newline age: 25 \newline \}, \newline \{ merge: true \} \newline );} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Delete Data from Cloud Firestore}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{db.collection("users") \newline .doc("3P86VJxcpBK0D0lsAyYx") \newline .delete() \newline .then(function () \{ \newline console.log("Document successfully deleted!"); \newline \}).catch( \newline function(error) \{ \newline console.error("Error removing document: ", error); \newline \}); \newline \newline db.collection("users") \newline .doc("3P86VJxcpBK0D0lsAyYx") \newline .update(\{ \newline \seqsplit{email.firestore.FieldValue.delete()} \newline \})} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Pretty straight forward.}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{addUsersToFirestore() \{ \newline var users = {[}\{ \newline name: "Raja", \newline email: "raja.tamil@email.com", \newline createdAt: new Date("2019-01-01 12:08:00") \newline \}, \newline \{ \newline name: "Arivu", \newline email: "arivu.selvan@email.com", \newline createdAt: new Date("2018-01-23 09:13:00") \newline \}, \{ \newline name: "Mike", \newline email: "mike.author@email.com", \newline createdAt: new Date("2018-08-08 06:37:00") \newline \}, \{ \newline name: "Praba", \newline email: "praba.karan@email.com", \newline createdAt: new Date("2018-10-09 18:26:00") \newline \}, \newline \{ \newline name: "Muhammad", \newline email: "muhammad.ali@email.com", \newline createdAt: new Date("2018-03-13 12:13:00") \newline \} \newline {]}; \newline const db = firebase.firestore(); \newline users.forEach(user =\textgreater{} \{ \newline \seqsplit{db.collection("users").doc().set(user);} \newline \}); \newline \}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{p{0.4977 cm} p{0.4977 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{5.377cm}}{\bf\textcolor{white}{Get Documents Data from Firestore Database}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{2}{x{5.377cm}}{} \tn % Row Count 0 (+ 0) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{5.377cm}}{db.collection("users") \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline console.log(doc.id); \newline \}); \newline \}); \newline \newline \newline db.collection("users") \newline .onSnapshot() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \});} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Get A Single Document Data}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{db.collection("users") \newline .doc("cAwTiq7IYKAbFGnhgKT3") \newline .get() \newline .then(doc =\textgreater{} \{ \newline console.log(doc.data()) \newline \})} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Get Data from Sub-collection in Firestore}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{db.collection("users") \newline .doc("cAwTiq7IYKAbFGnhgKT3") \newline .collection("posts") \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \}); \newline \newline \newline \newline \newline db.collection("users") \newline .doc("cAwTiq7IYKAbFGnhgKT3") \newline .collection("posts") \newline .doc("BjLZHiuQfVQVOu9nEG7k") \newline .get() \newline .then(snap =\textgreater{} \{ \newline \seqsplit{console.log(snap.data());} \newline \});} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Firestore Single/Multiple Where Query Filter}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{db.collection("users") \newline .where("age", "\textless{}=", 30) \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \}); \newline \newline \newline db.collection("users") \newline .where("age", "\textless{}=", 30) \newline .where("age", "\textgreater{}=", 20) \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \}); \newline \newline \newline db.collection("users") \newline .where("age", "\textgreater{}=", 20) \newline .where("gender", "==", "fmale") \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \});} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{p{0.4977 cm} p{0.4977 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{5.377cm}}{\bf\textcolor{white}{OrderBy and Limit Filters}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{2}{x{5.377cm}}{} \tn % Row Count 0 (+ 0) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{5.377cm}}{db.collection("users") \newline .where("age", "\textgreater{}=", 20) \newline .orderBy("age", "desc") \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \}); \newline \newline \newline db.collection("users") \newline .where("age", "\textgreater{}=", 20) \newline .orderBy("age", "desc") \newline .limit(2) \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \});} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Collection Group Queries}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{users/\{userID\}/posts/\{postID\} \newline \newline db.collectionGroup("posts") \newline .where("publishedAt", "\textgreater{}=", new Date("2018-01-01 00:00")) \newline .where("publishedAt", "\textless{}=", new Date("2018-12-31 23:59")) \newline .get() \newline .then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline console.log(doc.data()); \newline \}); \newline \}); \newline \newline service cloud.firestore \{ \newline match /databases/\{database\}/documents \{ \newline match /\{document=**\} \{ \newline allow read, write; \newline \} \newline \} \newline \newline \newline var cities = {[}{]}; \newline const cityRef = \seqsplit{firebase.firestore().collection("cities")} \newline var lastVisibleCitySnapShot = \{\}; \newline \newline const query = await \seqsplit{this.cityRef.orderBy("city").limit(10);} \newline query.get().then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline \seqsplit{this.cities.push(doc.data());} \newline \}); \newline \seqsplit{this.lastVisibleCitySnapShot} = snap.docs{[}snap.docs.length - 1{]}; \newline \}); \newline \newline \newline async next() \{ \newline this.cities = {[}{]}; \newline const query = await this.cityRef \newline .orderBy("city") \newline \seqsplit{.startAfter(this.lastVisibleCitySnapShot)} \newline .limit(10); \newline query.get().then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline \seqsplit{this.cities.push(doc.data());} \newline \}); \newline \seqsplit{this.lastVisibleCitySnapShot} = snap.docs{[}snap.docs.length - 1{]}; \newline \}); \newline \} \newline \newline \newline async prev() \{ \newline this.cities = {[}{]}; \newline const query = await this.cityRef \newline .orderBy("city") \newline \seqsplit{.endBefore(this.lastVisibleCitySnapShot)} \newline .limit(10); \newline query.get().then(snap =\textgreater{} \{ \newline snap.forEach(doc =\textgreater{} \{ \newline \seqsplit{this.cities.push(doc.data());} \newline \}); \newline \seqsplit{this.lastVisibleCitySnapShot} = snap.docs{[}snap.docs.length - 1{]}; \newline \}); \newline \},} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}