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
|
Funktion implementieren | ||||||||||||||||
$ | Suchen Sie das zu aktualisierende Dokument basierend auf der Abfrageauswahl | tr>||||||||||||||||
$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
|
||||||||||||||||
$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. |
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
$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.
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 } ] }
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 } ] }
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.
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.
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 ] }
<span class="pre">$pull操作符</span>
$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>, ... } }
{ _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" ]}
<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 } )
{ "_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>
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 ] }
db.profiles.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )
{ _id: 1, votes: [ 3, 5 ] }
假设我们有一个关于 调查的集合 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" ] ] }
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!