文章目录
  1. 1. 添加
    1. 1.1. pushAll
    2. 1.2. push
    3. 1.3. addToSet
  2. 2. 删除
    1. 2.1. pullAll
    2. 2.2. pull
    3. 2.3. pop
  3. 3. 提取数组部分信息
  4. 4. 参考

MongoDB中的Document是通过嵌套来描述数据之间的关系。对于嵌套了数组的Document来说,如何操作被嵌套的数组是本章我们将要介绍的内容。

首先我们给出一个Document-songlist:

{
  "_id" : 10,
  "createdTime" : 1363246285,
  "lastUpdated" : 1371398400,
  "songs" : [{
      "song_id" : 6086104,
      "order" : 1
    }, {
      "song_id" : 2049114,
      "order" : 2
    }, {
      "song_id" : 1030287,
      "order" : 3
    }, {
      "song_id" : 4306167,
      "order" : 4
    }, {
      "song_id" : 2089947,
      "order" : 5
    }, {
      "song_id" : 4487220,
      "order" : 6
    }, {
      "song_id" : 989231,
      "order" : 7
    }, {
      "song_id" : 6079061,
      "order" : 8
    }, {
      "song_id" : 2918203,
      "order" : 9
    }, {
      "song_id" : 6079120,
      "order" : 10
    }],
  "online_time" : 1371398400
}

如果我们需要往songs中添加一些歌或者删除一些歌,一种思路是直接取出整个文档,然后使用修改后的songs替换掉本来文档中的songs,然后再update整个文档。上面这种思路我们需要访问两次数据库,同时还需要手工遍历数组。更好的选择是直接操作文档中的数组。

添加

pushAll

将特定的值列表添加到数组中,格式如下:

{ $pushAll: { <field>: [ <value1>, <value2>, ... ] } }

push

将一个特定的值添加到数组中,格式如下:

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

2.4版本之后,push加上each代替了本来的pushAll。

db.songlist.update(
   { _id: 10 },
   {
     $push: {
       songs: {
          $each: [ { song_id: 5, order: 8 }, { song_id: 6, order: 9 }, { song_id: 7, order: 6 } ],
          $sort: { order: -1 },
          $slice: 3
       }
     }
   }
)

其中:

  1. the $each modifier to append to the array 2 new elements,
  2. the $sort modifier to order the elements by ascending (1) score
  3. the $slice modifier to keep the last 3 elements of the ordered array.

addToSet

The $addToSet operator adds a value to an array only if the value is not already in the array. If the value is in the array, $addToSet does not modify the array

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

删除

pullAll

删除数组中存在于给定列表中元素,格式如下:

{ $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }

pull

pull操作符可以定义查询语句,根据条件进行删除,格式如下:

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

实例:

db.songlist.update(
  { },
  { $pull: { songs: { song_id: 8 , order: 10 } } },
  { multi: true }
)

pop

The $pop operator removes the first or last element of an array. Pass $pop a value of -1 to remove the first element of an array and 1 to remove the last element in an array.

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

提取数组部分信息

根据上面的介绍,我们发现可以使用slice限定数组元素长度

{
  $push: {
     <field>: {
       $each: [ <value1>, <value2>, ... ],
       $slice: <num>
     }
  }
}

其中num可以是:

  1. Zero: To update the array to an empty array.
  2. Negative: To update the array to contain only the last elements.
  3. Positive: To update the array contain only the first elements.

参考

官方文档

文章目录
  1. 1. 添加
    1. 1.1. pushAll
    2. 1.2. push
    3. 1.3. addToSet
  2. 2. 删除
    1. 2.1. pullAll
    2. 2.2. pull
    3. 2.3. pop
  3. 3. 提取数组部分信息
  4. 4. 参考