Ce que cet article vous apporte concerne les opérations des types de tableaux dans MongoDB (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Dans le schéma de MongoDB, nous stockons souvent certaines données dans des types de tableaux, ce qui est une implémentation de notre conception de schéma imbriqué commune. Cette conception et cette implémentation de tableaux ne sont pas disponibles ou sont rares dans les bases de données relationnelles. Par conséquent, à travers cet article, nous allons trier les opérations associées aux tableaux MongoDB. Les opérations sur les tableaux peuvent être divisées en deux catégories, l’une étant les opérateurs de tableau et l’autre les modificateurs d’opérations de tableau.
Opérateur de tableau
|
Implémenter la fonction | ||||||||||||||||
$ | Localiser le document à mettre à jour en fonction du sélecteur de requête | tr>||||||||||||||||
$push | Ajouter des valeurs à un tableau | ||||||||||||||||
$pushAll | Ajouter un tableau à un milieu de tableau. (sera remplacé par $rach) | ||||||||||||||||
$addToSet | Ajoutez une valeur au tableau, et elle ne sera pas traitée si elle est répétée
|
||||||||||||||||
$pop | Supprime la première ou la dernière valeur du tableau. | ||||||||||||||||
$pull | Supprimez les valeurs correspondant aux conditions de requête du tableau. | ||||||||||||||||
$pullAll | Supprimer plusieurs valeurs d'un tableau. |
Modificateur | Implémenter la fonction |
$each | Utiliser avec $push et $addToSet pour opérer sur plusieurs valeurs. |
$slice | À utiliser avec $push et $each pour réduire la taille du tableau mis à jour. |
$sort | Utilisé avec $push, $each et $slice pour trier les sous-documents du tableau. |
1.$opérateur push
$push est principalement utilisé pour ajouter des éléments à un tableau.
Syntaxe :
{ $push: { <field1>: <value1>, ... } }
Par défaut, il ajoute un seul élément à la fin du tableau.
Supposons que nous ayons une collection de scores d'élèves, Studentscore, avec le format de document suivant :
{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 } ] } { "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 } ] }
L'exigence est de mettre à jour l'enregistrement du document avec _id 1, d'ajouter les scores de physique au champ du tableau de scores et de modifier le code en
db.studentscore.update({_id:1},{$push: {score:{"physics":100}}})
Après modification, la requête résultat est la suivante :
{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 }, { "physics" : 100 } ] } { "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 } ] }
Si vous insérez plusieurs La valeur est ajoutée au tableau et peut être combinée avec le modificateur de tableau <span class="pre">$each 一起使用。</span>
<span class="pre">例如,我们将小红的(_id =2)的物理成绩、化学成绩、生物成绩一起添加到文档中。执行的语句如下:</span>
db.studentscore.update({ _id: 2 }, { $push: { score: { $each: [{ "physics": 100 }, { "chemistry": 90 }, { "biology": 99 }] } } } )
Les résultats de la requête sont les suivants :
{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 }, { "physics" : 100 } ] } { "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 }, { "physics" : 100 }, { "chemistry" : 90 }, { "biology" : 99 } ] }
Nous avons parlé du $each modificateur d'opération de tableau plus tôt, alors reparlons-en. Pour donner un exemple, les deux modificateurs restants ont été expliqués ensemble ($sort et $slice)
Par exemple, nous avons la documentation suivante :
{ "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] }
Maintenant, nous avons une exigence, qui est d'abord d'ajouter trois enregistrements au champ du tableau des quiz du document. Ensuite, nous trions par score et sélectionnons le. trois premiers éléments du tableau. $ Le modificateur d'opération slice a été ajouté dans MongoDB 2.4 pour faciliter la gestion des tableaux fréquemment mis à jour. Cet opérateur est utile lors de l'ajout de valeurs à un tableau mais que vous ne souhaitez pas que le tableau soit trop grand. Il doit être utilisé avec les opérateurs $push et $each, ce qui lui permet de réduire la taille du tableau et de supprimer les anciennes valeurs.
Tout comme le modificateur d'opération $slice, MongoDB 2.4 ajoute un nouveau modificateur d'opération $sort pour faciliter la mise à jour des tableaux. Lors de l'utilisation de $push et $slice, il est parfois nécessaire de les trier puis de les supprimer.
db.students.update( { _id: 5 }, { $push: { quizzes: { $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ], $sort: { score: -1 }, $slice: 3 } } } )
{ "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10 }, { "wk" : 2, "score" : 8 }, { "wk" : 5, "score" : 8 } ]}
{ $pop: { <field>: <-1 | 1>, ... } }
Après la mise à jour, le document est le suivant
{ _id: 1, scores: [ 8, 9, 10 ] }
Continuez à démontrer, si sur la base existante, nous devons supprimer davantage le dernier élément du tableau (le score est de 10) , le SQL mis à jour est le suivant :
db.students.update( { _id: 1 }, { $pop: { scores: -1 } } )
Les résultats de la requête sont les suivants :
{ _id: 1, scores: [ 9, 10 ] }
3.
db.students.update( { _id: 1 }, { $pop: { scores: 1 } } )
$pull est la forme complexe de $pop. En utilisant $pull, vous pouvez spécifier exactement quels éléments supprimer par valeur.
Format de syntaxe
{ _id: 1, scores: [ 9 ] }
<span class="pre">$pull操作符</span>
avec la valeur
est le suivant :{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
<h5>"oranges", et supprimez également "carottes" à partir du champ du tableau de légumes, l'instruction de mise à jour est la suivante : <em>
{ _id: 1, fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ], vegetables: [ "carrots", "celery", "squash", "carrots" ]} { _id: 2, fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ], vegetables: [ "broccoli", "zucchini", "carrots", "onions" ]}
<span class="pre">"apples"</span>
<span class="pre">"oranges" 移除,还要将vegetables数组字段中的"carrots" 移除,其更新语句如下:</span>
À l'heure actuelle, dans le document de collection, le champ tableau de fruit n'a pas de </p>ni les pommes <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">db.stores.update(
{ },
{ $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
{ multi: true }
)</pre><div class="contentsignin">Copier après la connexion</div></div>
<p>les champs d'oranges et de légumes n'ont plus de carottes. </p>
condition spécifiée
{ "_id" : 1, "fruits" : [ "pears", "grapes", "bananas" ], "vegetables" : [ "celery", "squash" ]} { "_id" : 2, "fruits" : [ "plums", "kiwis", "bananas" ], "vegetables" : [ "broccoli", "zucchini", "onions" ]}
Si nous avons une collection de profils, son format de document est comme suit :
<span class="pre">apples也没有</span>
<span class="pre">oranges,vegetables数组字段也没有了carrots。</span>
{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }
假设我们有一个关于 调查的集合 survey,其数据如下:
{ _id: 1, results: [ { item: "A", score: 5 }, { item: "B", score: 8, comment: "Strongly agree" } ]} { _id: 2, results: [ { item: "C", score: 8, comment: "Strongly agree" }, { item: "B", score: 4 } ]}
需求是将 <span class="pre">score 为</span>
<span class="pre">8</span>
并且 <span class="pre">item</span>
为 <span class="pre">"B"的元素移除</span>
db.survey.update( { }, { $pull: { results: { score: 8 , item: "B" } } }, { multi: true } )
更新后的文档如下:
{ "_id" : 1, "results" : [ { "item" : "A", "score" : 5 } ]} { "_id" : 2, "results" : [ { "item" : "C", "score" : 8, "comment" : "Strongly agree" }, { "item" : "B", "score" : 4 } ]}
此时就要用到 <span class="pre">$elemMatch操作符。</span>
例如 文档格式如下:
{ _id: 1, results: [ { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] }, { item: "B", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ] } ] } { _id: 2, results: [ { item: "C", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ] }, { item: "B", score: 4, answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ] } ] }
需要将 results数组字段 移除,移除的条件是 results数组字段中的answers字段,符合 <span class="pre">q</span>
为 <span class="pre">2</span>
and <span class="pre">a</span>
大于等于 <span class="pre">8。</span>
db.survey.update( { }, { $pull: { results: { answers: { $elemMatch: { q: 2, a: { $gte: 8 } } } } } }, { multi: true } )
更新后的数据如下:
{ "_id" : 1, "results" : [ { "item" : "A", "score" : 5, "answers" : [ { "q" : 1, "a" : 4 }, { "q" : 2, "a" : 6 } ] } ] } { "_id" : 2, "results" : [ { "item" : "C", "score" : 8, "answers" : [ { "q" : 1, "a" : 8 }, { "q" : 2, "a" : 7 } ] } ] }
使用$addToSet也会往数组后面添加值,但是它比较特殊:它只会添加数组里不存在的值。
{ $addToSet: { <field1>: <value1>, ... } }
假如有一个集合 <span class="pre">inventory</span>
格式如下
{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
我们希望向向字段 tags 数组 ,添加一个元素accessories,则更新语句如下:
db.inventory.update( { _id: 1 }, { $addToSet: { tags: "accessories" } } )
更新后的结果为
{ "_id" : 1, "item" : "polarizing_filter", "tags" : [ "electronics", "camera", "accessories" ] }
如果想批量的增加如果元素,我们可以结合 <span class="pre">$each 操作符一起使用。</span>
例如以下文档
{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }
我们想在字段 tags 数组,添加元素 "camera", "electronics", "accessories",则更新语句如下:
db.inventory.update( { _id: 2 }, { $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } } )
更新后的结果如下:
{ _id: 2, item: "cable", tags: [ "electronics", "supplies", "camera", "accessories" ]}
需要注意是,如果添加的元素是数组格式,则会将新添加的元素保留为数组(将会出现数组嵌套数组)
例如
{ _id: 1, letters: ["a", "b"] }
执行的语句如下:
db.test.update( { _id: 1 }, { $addToSet: {letters: [ "c", "d" ] } } )
查询结构显示为
{ _id: 1, letters: [ "a", "b", [ "c", "d" ] ] }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!