-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path10-database-mongodb.html
103 lines (88 loc) · 4 KB
/
10-database-mongodb.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<section id="mongodb">
<section>
<h2>Base de données (MongoDB)</h2>
</section>
<section>
<h3>Driver NodeJS</h3>
<p>Pour utiliser une base de données dans notre application, nous allons commencer par installer un driver.</p>
<p>Dans notre cas, nous allons utiliser un driver MongoDB : <a href="https://www.npmjs.com/package/mongodb" target="_blank">mongodb</a></p>
<pre><code class="language-js">// bin/www
const MongoClient = require('mongodb').MongoClient;
/**
* Listen on provided port, on all network interfaces.
*/
MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true, useUnifiedTopology: true })
.then(client => {
app.locals.db = client.db('mydb'); // Enregistrement de la connexion dans les variables locales
server.listen(port); // Démarrer le serveur une fois la connexion ouverte
})
.catch(err => console.log(err))
;
server.on('error', onError);
server.on('listening', onListening);</code></pre>
</section>
<section>
<h3>Driver NodeJS</h3>
<p>Nous pouvons alors utiliser la connexion à la base de données dans nos routes :</p>
<pre><code class="language-js">router.get('/', function(req, res, next) {
const { db } = req.app.locals;
db.collection('users').find().toArray((err, users) => res.json(users));
});</code></pre>
<footer>
<a href="https://mongodb.github.io/node-mongodb-native/" class="info" target="_blank">Documentation driver MongoDB pour NodeJS</a>
</footer>
</section>
<section>
<h3>Mongoose</h3>
<p>Mongoose est un ORM/ODM pour NodeJS. Il va nous permettre d'utiliser la syntaxe objet pour manipuler nos données.</p>
<p>Installez le package <a href="https://www.npmjs.com/package/mongoose" target="_blank">mongoose</a> puis ouvrez une connection :</p>
<pre><code class="language-js">const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/socialquiz');
app.locals.db = mongoose.connection;
app.locals.db.once('open', () => {
app.listen(8000);
});
</code></pre>
</section>
<section>
<h3>Mongoose</h3>
<p>Nous allons maintenant créer un nouvel objet <strong>Question</strong> :</p>
<pre><code class="language-js">// models/Question.js
const mongoose = require('mongoose');
const questionSchema = new mongoose.Schema({
title: String,
content: String,
image: String
});
module.exports = mongoose.model('Question', questionSchema);</code></pre>
</section>
<section>
<h3>Mongoose</h3>
<p>Vous pouvez ensuite enregistrer les données en base de données de cette façon :</p>
<pre><code class="language-js">let question = new Question(req.body);
question.save((err, question) => {
if (err) throw err;
res.redirect('/');
});</code></pre>
</section>
<section>
<h3>Mongoose</h3>
<p>L'ORM Mongoose propose une méthode <code class="language-js">populate()</code> qui permet d'effectuer des jointures entre les collections plus facilement qu'avec l'aggregation <code class="language-js">$lookup</code> :</p>
<pre><code class="language-js">Question.findOne({ title: 'test' }).populate('user').exec((err, question) => res.json(question))</code></pre>
<footer>
<a href="https://mongoosejs.com/docs/populate.html" class="info" target="_blank">Populate documentation</a>
</footer>
</section>
<section>
<h3>Mongoose</h3>
<div class="instructions">
<ol>
<li>Ajoutez une propriété <strong>created_at</strong> sur chaque Document</li>
<li>Afficher la liste des dernières questions sur la page d'accueil</li>
<li>Ajouter une catégorie et plusieurs tags sur chaque Document</li>
<li>Ajouter les champs correspondant dans le formulaire</li>
<li>Afficher ces informations dans la liste des questions sur la page d'accueil</li>
</ol>
</div>
</section>
</section>