Maison > base de données > tutoriel mysql > Opérations sur les types de tableaux dans MongoDB (exemple de code)

Opérations sur les types de tableaux dans MongoDB (exemple de code)

不言
Libérer: 2019-01-30 10:26:33
avant
3869 Les gens l'ont consulté

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

tr>
操作符 实现功能
$ 根据查询选择器定位要更新的文档
$push 添加值到数组中
$pushAll 添加数组到一个数组中。(将被$rach取代)
$addToSet

添加值到数组中,重复了也不处理

$pop 从数组中删除第一个或者最后一个值。
$pull 从数组中删除匹配查询条件的值。
$pullAll 从数组中删除多个值。
Opérateur

Implémenter la fonction
$ Localiser le document à mettre à jour en fonction du sélecteur de requête
$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
修饰符 实现功能
$each 与$push和$addToSet一起使用来操作多个值。
$slice 与$push和$each一起使用来缩小更新后数组的大小。
$sort 与$push、$each、$slice一起来排序数组中的子文档。
$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 d'opération de 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

1.1 Syntaxe et description de la fonction

$push est principalement utilisé pour ajouter des éléments à un tableau.

Syntaxe :

{ $push: { <field1>: <value1>, ... } }
Copier après la connexion

Par défaut, il ajoute un seul élément à la fin du tableau.

1.2 Cas d'opération

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 } ] }
Copier après la connexion

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}}})
Copier après la connexion

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 } ] }
Copier après la connexion

1.3 Combiné avec le modificateur $each, insertion par lots

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 }]
            }

        }
    }
)
Copier après la connexion

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 } ] }
Copier après la connexion

1.4 L'utilisation des modificateurs de tableau $sort et $slice

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 }   
      ]
      }
Copier après la connexion

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
       }
     }
   }
)
Copier après la connexion
2. Opérateur $pop

2.1 Syntaxe et description de la fonction

L'opérateur $pop peut supprimer le premier ou le meilleur élément du tableau.

{
  "_id" : 5,
  "quizzes" : [
     { "wk" : 1, "score" : 10 },
     { "wk" : 2, "score" : 8 },
     { "wk" : 5, "score" : 8 }  ]}
Copier après la connexion

Le paramètre est -1, ce qui signifie que le premier élément du tableau doit être supprimé, le paramètre est 1, ce qui signifie le dernier élément ; dans le tableau doit être supprimé.

2.2 Cas d'Opération

Par exemple, il y a les documents suivants dans la collection étudiants :

{ $pop: { <field>: <-1 | 1>, ... } }
Copier après la connexion
Notre besoin est de Le premier élément du tableau (score 8) est supprimé, et l'instruction SQL est la suivante :

Après la mise à jour, le document est le suivant

{ _id: 1, scores: [ 8, 9, 10 ] }
Copier après la connexion

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 } } )
Copier après la connexion

Les résultats de la requête sont les suivants :

{ _id: 1, scores: [ 9, 10 ] }
Copier après la connexion

3.

db.students.update( { _id: 1 }, { $pop: { scores: 1 } } )
Copier après la connexion
3.1 Syntaxe et description de la fonction

$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 ] }
Copier après la connexion

<span class="pre">$pull操作符</span>

3.2 Cas d'opération

3.2.1 Supprimer égal à spécifié dans le array Le document de test de l'élément

avec la valeur

est le suivant :

{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
Copier après la connexion

L'exigence de l'opération est de changer le < code class= dans le champ du tableau fruits Supprimez "docutils literal">

"pommes"

et <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" ]}
Copier après la connexion
Le résultat mis à jour est le suivant :

<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: [ &quot;apples&quot;, &quot;oranges&quot; ] }, vegetables: &quot;carrots&quot; } }, { 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>

3.2.2 Supprimer les éléments du tableau qui répondent à la

condition spécifiée

{
  "_id" : 1,
  "fruits" : [ "pears", "grapes", "bananas" ],
  "vegetables" : [ "celery", "squash" ]}
{
  "_id" : 2,
  "fruits" : [ "plums", "kiwis", "bananas" ],
  "vegetables" : [ "broccoli", "zucchini", "onions" ]}
Copier après la connexion

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>

Nous souhaitons supprimer les éléments avec des votes supérieurs ou égaux à 6. L'énoncé est le suivant :

{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }
Copier après la connexion
Les résultats mis à jour sont les suivants :

3.2.3 移除数组中内嵌子文档(即此时数组元素是子文档,每一个{}中的内容是一个数组元素)

假设我们有一个关于 调查的集合 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 }   ]}
Copier après la connexion

需求是将 <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 }
)
Copier après la connexion

更新后的文档如下:

{
   "_id" : 1,
   "results" : [ { "item" : "A", "score" : 5 } ]}
{
  "_id" : 2,
  "results" : [
      { "item" : "C", "score" : 8, "comment" : "Strongly agree" },
      { "item" : "B", "score" : 4 }   ]}
Copier après la connexion

3.2.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 } ] }
   ]
}
Copier après la connexion

需要将 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 }
)
Copier après la connexion

更新后的数据如下:

{
   "_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 } ] }
   ]
}
Copier après la connexion

4.$addToSet

4.1 语法及功能描述

使用$addToSet也会往数组后面添加值,但是它比较特殊:它只会添加数组里不存在的值。

{ $addToSet: { <field1>: <value1>, ... } }
Copier après la connexion

4.2 操作案例

假如有一个集合 <span class="pre">inventory</span> 格式如下

{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
Copier après la connexion

我们希望向向字段 tags 数组 ,添加一个元素accessories,则更新语句如下:

db.inventory.update(
   { _id: 1 },
   { $addToSet: { tags: "accessories" } }
)
Copier après la connexion

更新后的结果为

{ "_id" : 1, "item" : "polarizing_filter", "tags" : [ "electronics", "camera", "accessories" ] }
Copier après la connexion

如果想批量的增加如果元素,我们可以结合 <span class="pre">$each 操作符一起使用。</span>

例如以下文档

{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }
Copier après la connexion

我们想在字段 tags 数组,添加元素 "camera", "electronics", "accessories",则更新语句如下:

db.inventory.update(
   { _id: 2 },
   { $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } }
 )
Copier après la connexion

更新后的结果如下:

{
  _id: 2,
  item: "cable",
  tags: [ "electronics", "supplies", "camera", "accessories" ]}
Copier après la connexion

4.3 注意点

需要注意是,如果添加的元素是数组格式,则会将新添加的元素保留为数组(将会出现数组嵌套数组)

例如

{ _id: 1, letters: ["a", "b"] }
Copier après la connexion

执行的语句如下:

db.test.update(
   { _id: 1 },
   { $addToSet: {letters: [ "c", "d" ] } }
)
Copier après la connexion

查询结构显示为

{ _id: 1, letters: [ "a", "b", [ "c", "d" ] ] }
Copier après la connexion

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal