>  기사  >  데이터 베이스  >  MongoDB의 배열 유형에 대한 작업(코드 예)

MongoDB의 배열 유형에 대한 작업(코드 예)

不言
不言앞으로
2019-01-30 10:26:333801검색

이 기사는 MongoDB의 배열 유형 작업(코드 예제)에 대한 내용을 제공합니다. 필요한 친구가 참고할 수 있기를 바랍니다.

MongoDB의 스키마에서는 일부 데이터를 배열 유형으로 저장하는 경우가 많습니다. 이는 일반적인 중첩 스키마 디자인을 구현한 것입니다. 이러한 배열 설계 및 구현은 관계형 데이터베이스에서는 사용할 수 없거나 흔하지 않습니다. 따라서 이번 글을 통해 MongoDB 어레이의 관련 연산을 정리해 보겠습니다. 배열에 대한 연산은 두 가지 범주로 나눌 수 있습니다. 하나는 배열 연산자이고 다른 하나는 배열 연산 수정자입니다.

배열 연산자

operator 는 쿼리에 따라 업데이트할 문서를 찾기 위한
$ 함수를 구현합니다. 선택기
$push 배열에 값 추가
$pushAll 배열에 배열을 추가합니다. ($rach로 대체됨)
$addToSet

배열에 값을 추가하고 반복되면 처리하지 않습니다.

$pop 배열에서 첫 번째 또는 마지막 값을 제거합니다.
$pull 배열에서 쿼리 기준과 일치하는 값을 제거합니다.
$pullAll 배열에서 여러 값을 제거합니다.

배열 연산 수정자

modifier 구현 함수
$each 여러 값을 연산하려면 $push 및 $addToSet과 함께 사용하세요.
$slice 은 업데이트된 배열의 크기를 줄이기 위해 $push 및 $each와 함께 사용됩니다.
$sort $push, $each 및 $slice와 함께 작동하여 하위 문서를 배열로 정렬합니다.

1.$push 연산자

1.1 구문 및 함수 설명

$push는 주로 배열에 요소를 추가하는 데 사용됩니다.

구문:

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

기본적으로 배열 끝에 단일 요소를 추가합니다.

1.2 운영 사례

학생 점수 컬렉션이 있다고 가정하고, 문서 형식은 다음과 같습니다:

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

1.4 数组修饰符 $sort 和 $slice的使用

前面讲了$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时,有时候要先排序再删除它们。

2. $pop 操作符

2.1 语法及功能描述

$pop操作符可以实现从数组中删除第一个或者是最好一个元素。

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

参数为-1 ,代表要删除数组中的第一个元素;参数为1 ,代表要删除数组中的最后一个元素。

2.2 操作案例

例如集合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 ] }

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

3.1 语法及功能描述

$pull是$pop的复杂形式。使用$pull,可以通过值精确指定要删除的元素。

语法格式

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

 3.2 操作案例

3.2.1 移除数组中等于指定值的元素

测试文档如下:

{
   _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를 사용하다 보면 정렬 후 삭제가 필요한 경우가 있습니다. #🎜🎜#

2. $pop 연산자

#🎜🎜#2.1 구문 및 함수 설명#🎜🎜##🎜🎜#$pop 연산자는 배열에서 첫 번째 또는 마지막 항목을 삭제할 수 있습니다. #🎜🎜##🎜🎜##🎜🎜#
{
   "_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>, ... } }
#🎜🎜##🎜🎜#

3. <span class="pre">$pull 연산자</span>

#🎜🎜#3.1 구문 및 함수 설명#🎜🎜##🎜🎜#$ pull은 $pop의 복잡한 형태입니다. $pull을 사용하면 삭제할 요소를 값별로 정확하게 지정할 수 있습니다. #🎜🎜##🎜🎜#문법 형식#🎜🎜##🎜🎜##🎜🎜#
{ _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"] }
# 🎜🎜##🎜🎜#
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" ] ] }

위 내용은 MongoDB의 배열 유형에 대한 작업(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제