Heim  >  Artikel  >  Datenbank  >  Operationen an Array-Typen in MongoDB (Codebeispiel)

Operationen an Array-Typen in MongoDB (Codebeispiel)

不言
不言nach vorne
2019-01-30 10:26:333816Durchsuche

In diesem Artikel geht es um die Operationen von Array-Typen in MongoDB (Codebeispiele). Ich hoffe, dass er für Freunde hilfreich ist.

Im MongoDB-Schema speichern wir häufig einige Daten in Array-Typen, was eine Implementierung unseres üblichen verschachtelten Schemadesigns ist. Dieser Entwurf und diese Implementierung von Arrays sind in relationalen Datenbanken nicht verfügbar oder ungewöhnlich. Daher werden wir in diesem Artikel die zugehörigen Vorgänge von MongoDB-Arrays klären. Operationen auf Arrays können in zwei Kategorien unterteilt werden: die eine sind Array-Operatoren und die andere sind Array-Operationsmodifikatoren.

Array-Operator

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

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

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

Funktion implementieren
$ Suchen Sie das zu aktualisierende Dokument basierend auf der Abfrageauswahl
$push Werte zu einem Array hinzufügen
$pushAll Ein Array hinzufügen zu einer Array-Mitte. (wird durch $rach ersetzt)
$addToSet Fügen Sie dem Array einen Wert hinzu, und dieser wird bei Wiederholung nicht verarbeitet
修饰符 实现功能
$each 与$push和$addToSet一起使用来操作多个值。
$slice 与$push和$each一起使用来缩小更新后数组的大小。
$sort 与$push、$each、$slice一起来排序数组中的子文档。
$pop Löscht den ersten oder letzten Wert aus dem Array.
$pull Entfernen Sie Werte, die den Abfragebedingungen entsprechen, aus dem Array.
$pullAll Entfernen Sie mehrere Werte aus einem Array.
Array-Operationsmodifikator
Modifikator Funktion implementieren
$each Verwenden mit $push und $addToSet, um mit mehreren Werten zu arbeiten.
$slice Verwendung mit $push und $each, um die Größe des aktualisierten Arrays zu reduzieren.
$sort Wird zusammen mit $push, $each und $slice verwendet, um die Unterdokumente im Array zu sortieren.

1.$push-Operator

1.1 Syntax- und Funktionsbeschreibung

$push wird hauptsächlich zum Hinzufügen von Elementen zu einem Array verwendet.

Syntax:

{ $push: { <field1>: <value1>, ... } }

Standardmäßig wird ein einzelnes Element am Ende des Arrays hinzugefügt.

1.2 Operationsfall

Angenommen, wir haben eine Sammlung von Schülerergebnissen, Studentscore, mit dem folgenden Dokumentformat:

{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 } ] }
{ "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 } ] }

wo Die Anforderung besteht darin, den Dokumentdatensatz mit _id 1 zu aktualisieren, Physiknoten zum Feld des Punktearrays hinzuzufügen und den Code in

db.studentscore.update({_id:1},{$push: {score:{"physics":100}}})

Nachher zu ändern Modifikation, die Ergebnisabfrage lautet wie folgt:

{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 }, { "physics" : 100 } ] }
{ "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 } ] }

1.3 Kombiniert mit $each-Modifikator, Batch-Einfügung

Wenn mehrere Werte hinzugefügt werden gleichzeitig zum Array hinzufügen, Kann mit Array-Modifikatoren kombiniert werden <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 }]
            }

        }
    }
)

Die Abfrageergebnisse lauten wie folgt :

{ "_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 } ] }

1.4 Die Verwendung der Array-Modifikatoren $sort und $slice

Wir haben vorhin über den Array-Operationsmodifikator $each gesprochen, also lasst uns weitermachen Geben Sie ein weiteres Beispiel, um die verbleibenden beiden zu ändern. Die Symbole wurden zusammen erklärt ($sort und $slice)

Zum Beispiel haben wir die folgende Dokumentation:

{
   "_id" : 5,
   "quizzes" : [
      { "wk": 1, "score" : 10 },
      { "wk": 2, "score" : 8 },
      { "wk": 3, "score" : 5 },
      { "wk": 4, "score" : 6 }   
      ]
      }

Jetzt müssen wir zunächst drei Datensätze an das Quiz-Array-Feld des Dokuments anhängen. Dann sortieren wir nach Punktzahl und wählen die ersten drei Elemente im Array aus.

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

Die aktualisierten Ergebnisse werden wie folgt angezeigt:

{
  "_id" : 5,
  "quizzes" : [
     { "wk" : 1, "score" : 10 },
     { "wk" : 2, "score" : 8 },
     { "wk" : 5, "score" : 8 }  ]}

$slice-Operationsmodifikator Es wurde in MongoDB 2.4 hinzugefügt, um die Verwaltung häufig aktualisierter Arrays zu erleichtern. Dieser Operator ist nützlich, wenn Sie Werte zu einem Array hinzufügen, das Array aber nicht zu groß werden soll. Es muss mit den Operatoren $push und $each verwendet werden, um die Größe des Arrays zu verkürzen und alte Werte zu löschen.

Ähnlich wie der Operationsmodifikator $slice fügt MongoDB 2.4 einen neuen Operationsmodifikator $sort hinzu, um die Aktualisierung von Arrays zu erleichtern. Bei der Verwendung von $push und $slice ist es manchmal notwendig, diese zu sortieren und dann zu löschen.

2. $pop-Operator

2.1 Syntax und Funktionsbeschreibung

Der $pop-Operator kann das erste oder beste Element aus dem Array löschen.

{ $pop: { <field>: <-1 | 1>, ... } }

Der Parameter ist -1, was bedeutet, dass das erste Element im Array gelöscht werden soll; der Parameter ist 1, was bedeutet, dass das letzte Element im Array gelöscht werden soll Array soll gelöscht werden.

2.2 Operationsfall

Zum Beispiel gibt es die folgenden Dokumente in der Studentensammlung:

{ _id: 1, scores: [ 8, 9, 10 ] }

Unser Bedarf ist Um das Array einzufügen, wird das erste Element (Punktzahl 8) entfernt und die SQL-Anweisung lautet wie folgt:

db.students.update( { _id: 1 }, { $pop: { scores: -1 } } )

Nach der Aktualisierung ist das Dokument wie folgt Es folgt

{ _id: 1, scores: [ 9, 10 ] }

Demonstrieren Sie weiterhin, ob wir auf der vorhandenen Basis das letzte Element des Arrays weiter entfernen müssen (Score ist 10), das aktualisierte SQL lautet wie folgt:

db.students.update( { _id: 1 }, { $pop: { scores: 1 } } )

Die Abfrageergebnisse lauten wie folgt:

{ _id: 1, scores: [ 9 ] }

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

3.1 Syntax und Funktionsbeschreibung

$pull ist die komplexe Form von $pop. Mit $pull können Sie anhand des Werts genau angeben, welche Elemente gelöscht werden sollen.

Syntaxformat

{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }

3.2 Betriebsfall

3.2.1 Entfernen Sie den Wert gleich angegebener Wert
von 🎜> lautet wie folgt:

{
   _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" ]}

Die Betriebsanforderung besteht darin, den <p>"Äpfel"<code class="docutils literal"><span class="pre">"apples"</span>

und <code class="docutils literal"><span class="pre">"oranges" 移除,还要将vegetables数组字段中的"carrots" 移除,其更新语句如下:</span>"Orangen" werden entfernt, und "Karotten" im Das Gemüse-Array-Feld wird ebenfalls entfernt und seine Aktualisierungsanweisung lautet wie folgt:

db.stores.update(
    { },
    { $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
    { multi: true }
)

Die aktualisierten Ergebnisse lauten wie folgt:

{
  "_id" : 1,
  "fruits" : [ "pears", "grapes", "bananas" ],
  "vegetables" : [ "celery", "squash" ]}
{
  "_id" : 2,
  "fruits" : [ "plums", "kiwis", "bananas" ],
  "vegetables" : [ "broccoli", "zucchini", "onions" ]}

<span class="pre">apples也没有</span>Zu diesem Zeitpunkt enthält das Array-Feld „Frucht“ im Sammlungsdokument weder <code class="docutils literal"><span class="pre">oranges,vegetables数组字段也没有了carrots。</span>Äpfel noch

<h5>oranges , das Gemüse-Array-Feld enthält auch keine Karotten. <em></em> </h5>3.2.2 Elemente aus dem Array entfernen, die die

angegebene Bedingung erfüllen

Wenn wir eine Sammlung von Profilen haben, lautet das Dokumentformat wie folgt:

{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }

Wir möchten Elemente mit Stimmen größer oder gleich 6 entfernen. Die Anweisung lautet wie folgt:

db.profiles.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )

Die aktualisierten Ergebnisse lauten wie folgt:

{ _id: 1, votes: [  3,  5 ] }
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 }   ]}

需求是将 <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 }   ]}

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

需要将 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 } ] }
   ]
}

4.$addToSet

4.1 语法及功能描述

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

{ $addToSet: { <field1>: <value1>, ... } }

4.2 操作案例

假如有一个集合 <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" ]}

4.3 注意点

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

例如

{ _id: 1, letters: ["a", "b"] }

执行的语句如下:

db.test.update(
   { _id: 1 },
   { $addToSet: {letters: [ "c", "d" ] } }
)

查询结构显示为

{ _id: 1, letters: [ "a", "b", [ "c", "d" ] ] }

Das obige ist der detaillierte Inhalt vonOperationen an Array-Typen in MongoDB (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen