이 기사는 MongoDB의 배열 유형 작업(코드 예제)에 대한 내용을 제공합니다. 필요한 친구가 참고할 수 있기를 바랍니다.
MongoDB의 스키마에서는 일부 데이터를 배열 유형으로 저장하는 경우가 많습니다. 이는 일반적인 중첩 스키마 디자인을 구현한 것입니다. 이러한 배열 설계 및 구현은 관계형 데이터베이스에서는 사용할 수 없거나 흔하지 않습니다. 따라서 이번 글을 통해 MongoDB 어레이의 관련 연산을 정리해 보겠습니다. 배열에 대한 연산은 두 가지 범주로 나눌 수 있습니다. 하나는 배열 연산자이고 다른 하나는 배열 연산 수정자입니다.
배열 연산자
operator | 는 쿼리에 따라 업데이트할 문서를 찾기 위한 |
$ | 함수를 구현합니다. 선택기 |
$push | 배열에 값 추가 |
$pushAll | 배열에 배열을 추가합니다. ($rach로 대체됨) |
$addToSet | 배열에 값을 추가하고 반복되면 처리하지 않습니다. |
$pop | 배열에서 첫 번째 또는 마지막 값을 제거합니다. |
$pull | 배열에서 쿼리 기준과 일치하는 값을 제거합니다. |
$pullAll | 배열에서 여러 값을 제거합니다. |
배열 연산 수정자
modifier | 구현 함수 |
$each | 여러 값을 연산하려면 $push 및 $addToSet과 함께 사용하세요. |
$slice | 은 업데이트된 배열의 크기를 줄이기 위해 $push 및 $each와 함께 사용됩니다. |
$sort | $push, $each 및 $slice와 함께 작동하여 하위 문서를 배열로 정렬합니다. |
1.$push 연산자
$push는 주로 배열에 요소를 추가하는 데 사용됩니다.
구문:
{ $push: { <field1>: <value1>, ... } }
기본적으로 배열 끝에 단일 요소를 추가합니다.
학생 점수 컬렉션이 있다고 가정하고, 문서 형식은 다음과 같습니다:
{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 } ] } { "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 } ] }# 🎜🎜 #요구사항은 문서 레코드를 _id 1로 업데이트하고, 점수 배열 필드에 물리 점수를 추가하고, 코드를 #🎜🎜로 수정하는 것입니다. #
db.studentscore.update({_id:1},{$push: {score:{"physics":100}}})
수정 후 결과 쿼리는 다음과 같습니다.
{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 }, { "physics" : 100 } ] } { "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 } ] }
1.3 $each 수정자와 결합, 일괄 삽입
<span class="pre">$each를 함께 사용합니다. </span>
<span class="pre">예를 들어 Xiaohong(_id =2)은 물리 점수, 화학 점수, 생물학 점수가 함께 문서에 추가됩니다. 실행된 문은 다음과 같습니다.</span>
<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 }] } } } )
查询的结果如下:
{ "_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 } ] }
前面讲了$each 数组运算修饰符,那我们再举一个例子,将剩余的两个修饰符一起讲解了好了($sort 和 $slice)
例如,我们有文档记录如下:
{ "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] }
现在我们,有个需求,就是 首先向文档的quizzes数组字段,追加三个记录,然后,我们再按照score排序,选取数组中的前三个元素。
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 } ]}
$slice操作修饰符是在MongoDB 2.4 里添加的,其目的是方便管理经常更新的数组。当向数组添加值但是不想数组太大的时候,这个操作符非常有用。它必须与$push、$each操作符一起使用,允许用来剪短数组的大小、删除旧的值。
与$slice操作修饰符很像,MongoDB 2.4 新增了$sort操作修饰符,帮助更新数组。当使用$push和$slice时,有时候要先排序再删除它们。
$pop操作符可以实现从数组中删除第一个或者是最好一个元素。
{ $pop: { <field>: <-1 | 1>, ... } }
参数为-1 ,代表要删除数组中的第一个元素;参数为1 ,代表要删除数组中的最后一个元素。
例如集合students 中有以下文档:
{ _id: 1, scores: [ 8, 9, 10 ] }
我们的需求是要把数组中的第一个元素(成绩为8)移除,SQL 语句如下:
db.students.update( { _id: 1 }, { $pop: { scores: -1 } } )
更新后,文档如下
{ _id: 1, scores: [ 9, 10 ] }
继续演示,如果在现有的基础上,我们需要进一步把数组的最后一个元素移除(成绩为10),更新的sQL如下:
db.students.update( { _id: 1 }, { $pop: { scores: 1 } } )
查询结果 如下:
{ _id: 1, scores: [ 9 ] }
<span class="pre">$pull操作符</span>
$pull是$pop的复杂形式。使用$pull,可以通过值精确指定要删除的元素。
语法格式
{ $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" ]}
操作要求是将 数组字段fruits中的<span class="pre">"apples"</span>
and <span class="pre">"oranges" 移除,还要将vegetables数组字段中的"carrots" 移除,其更新语句如下:</span>
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" ]}
此时,集合文档中,fruit的数组字段 没有<span class="pre">apples也没有</span>
<span class="pre">oranges,vegetables数组字段也没有了carrots。</span>
{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }
db.profiles.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )1.4 배열 수정자 $sort 및 $slice 사용 $each 배열 연산 수정자에 대해 이야기했습니다. 이전에 다시 이야기해 보겠습니다. 예를 들어 나머지 두 수식어를 함께 설명합니다($sort 및 $slice) 예를 들어 다음 문서가 있습니다.
#🎜 🎜##🎜🎜 #
{ _id: 1, votes: [ 3, 5 ] }이제 요구 사항이 있습니다. 먼저 문서의 퀴즈 배열 필드에 세 개의 레코드를 추가한 다음 점수별로 정렬하고 선택합니다. 배열 요소의 처음 세 개.
{ _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 } ]}업데이트된 결과는 다음과 같습니다. #🎜🎜##🎜🎜##🎜🎜#
db.survey.update( { }, { $pull: { results: { score: 8 , item: "B" } } }, { multi: true } )#🎜🎜## 🎜🎜##🎜🎜# $slice 연산 수정자는 자주 업데이트되는 배열의 관리를 용이하게 하기 위해 MongoDB 2.4에 추가되었습니다. 이 연산자는 배열에 값을 추가하지만 배열이 너무 커지는 것을 원하지 않을 때 유용합니다. $push 및 $each 연산자와 함께 사용해야 하며 배열 크기를 줄이고 이전 값을 삭제하는 데 사용할 수 있습니다. #🎜🎜##🎜🎜#$slice 작업 수정자와 마찬가지로 MongoDB 2.4에는 배열 업데이트에 도움이 되는 새로운 $sort 작업 수정자가 추가되었습니다. $push와 $slice를 사용하다 보면 정렬 후 삭제가 필요한 경우가 있습니다. #🎜🎜#
{ "_id" : 1, "results" : [ { "item" : "A", "score" : 5 } ]} { "_id" : 2, "results" : [ { "item" : "C", "score" : 8, "comment" : "Strongly agree" }, { "item" : "B", "score" : 4 } ]}#🎜🎜##🎜🎜##🎜🎜#매개변수는 -1입니다. 이는 배열의 첫 번째 요소를 삭제하려는 의미입니다. 의 마지막 요소인 배열의 첫 번째 요소를 삭제하려는 것을 의미합니다. #🎜🎜##🎜🎜#2.2 작업 사례 #🎜🎜##🎜🎜#예를 들어 컬렉션 학생에게는 다음 문서가 있습니다. #🎜🎜##🎜🎜##🎜🎜#
{ _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 } ] } ] }#🎜🎜##🎜🎜 ##🎜 🎜#우리의 요구 사항은 배열의 첫 번째 요소(점수 8)를 제거하는 것입니다. SQL 문은 다음과 같습니다. #🎜🎜##🎜🎜##🎜🎜#
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 } ] } ] }#🎜🎜##🎜🎜##🎜🎜#계속해서 시연하세요. 기존 기반이라면 추가 작업이 필요합니다. 배열의 마지막 부분을 넣습니다. 한 요소가 제거되고(점수는 10) 업데이트된 SQL은 다음과 같습니다. 쿼리 결과는 다음과 같습니다. #🎜🎜##🎜 🎜##🎜🎜#
{ $addToSet: { <field1>: <value1>, ... } }#🎜🎜##🎜🎜#
<span class="pre">$pull 연산자</span>
{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }#🎜🎜##🎜🎜##🎜🎜# 3.2 연산 사례 #🎜🎜##🎜🎜#3.2.1 이동 배열의 #🎜🎜##🎜🎜# 요소를 #🎜🎜# 지정된 값 #🎜🎜#과 동일하게 나눕니다. 테스트 문서는 다음과 같습니다. #🎜🎜##🎜🎜##🎜🎜#
db.inventory.update( { _id: 1 }, { $addToSet: { tags: "accessories" } } )#🎜 🎜##🎜🎜## 🎜🎜#작업 요구 사항은
<span class="pre">"apples"</span>
및 배열 필드의 과일 <span class="pre">"oranges"가 제거되고, 야채 배열 필드의 "carrots"도 제거됩니다. 업데이트 문은 다음과 같습니다:</span>
#🎜🎜##🎜🎜## 🎜🎜#{ "_id" : 1, "item" : "polarizing_filter", "tags" : [ "electronics", "camera", "accessories" ] }#🎜🎜##🎜🎜##🎜🎜#업데이트된 결과는 다음과 같습니다. #🎜🎜##🎜🎜##🎜🎜#
{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }#🎜🎜# #🎜🎜##🎜🎜# 이때 컬렉션 문서에는 과일 배열 밭에
<span class="pre">사과도</span><code class="doutils literal"><span class="pre">오렌지와 야채 배열 밭에는 더 이상 당근이 없습니다. </span>
#🎜🎜##🎜🎜#3.2.2 #🎜🎜#지정 조건을 충족하는 배열에서 요소 제거 #🎜🎜# #🎜🎜##🎜🎜# 프로필 컬렉션이 있는 경우 , 문서 형식은 다음과 같습니다: #🎜🎜##🎜🎜##🎜🎜#db.inventory.update( { _id: 2 }, { $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } } )#🎜🎜##🎜🎜##🎜🎜#우리는 6보다 크거나 같은 표를 가진 요소를 제거하고 싶습니다. #🎜 🎜##🎜🎜##🎜🎜#
{ _id: 2, item: "cable", tags: [ "electronics", "supplies", "camera", "accessories" ]}#🎜🎜##🎜🎜##🎜🎜#업데이트된 결과는 다음과 같습니다. #🎜🎜##🎜🎜##🎜🎜#
{ _id: 1, letters: ["a", "b"] }# 🎜🎜##🎜🎜#
假设我们有一个关于 调查的集合 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" ] ] }
위 내용은 MongoDB의 배열 유형에 대한 작업(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!