1.数组末尾加入一个元素

push的作用就是,如果指定的键已经存在,它会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$push:{“relationships”:{“fname”:”xiong”,”lname”:”lan”}}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [

    {

        "fname" : "deng",

        "lname" : "pan"

    },

    {

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "fname" : "dongren",

        "lname" : "zeng"

    },

    {

        "fname" : "xiong",

        "lname" : "lan"

    }

]

2.数组末尾删除一个元素

对数组进行“减”操作,能达到对数组“减”目的的修改器有两个,pop和pull

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pop:{“relationships”:1}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [

    {

        "fname" : "deng",

        "lname" : "pan"

    },

    {

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "fname" : "dongren",

        "lname" : "zeng"

    },

]

3.数组开头删除一个元素

从数组的开头删除该怎么办呢。很简单,把上面的“1”改成“-1”,它将逆向操作

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pop:{“relationships”:-1}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [


    {

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "fname" : "dongren",

        "lname" : "zeng"

    }

]

4.数组中间删除一个元素

想删除数组中间的呢。这时,$pull派上用场
pull可以将数组中间的数据删除。这里还有一点要注意,pull会将所有匹配到的数据都删除

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pull:{“relationships”:{“fname”:”dongren”,”lname”:”zeng”}}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [

    {

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "fname" : "xiong",

        "lname" : "lan"

    }

]

5.过滤元素

1.我们再往数组里插入一相同的数据,它是能正常插入到数组的。而在实际生产环境中,我们都不想看到这样的结果,
那么,这里又出现了两个可以用的修改器:ne和addToSet。$ne主要拿来判断,若数组里面有这个值,则不插入;没有才插入

db.user.update({“relationships.fname”:{ne:"xiong"}},{set:{“fname”:”xiong”,”lname”:”lan”}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [

    {

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "fname" : "xiong",

        "lname" : "lan"

    },


]

2.ddToSet比ne更好用,它可以自己判断数据是否存在,而且它和each结合使用,还能同时在数组中插入多个数据,这是ne没办法办到的

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{addToSet:{"relationships":{each:[{“fname”:”xiong”,”lname”:”lan”},
{“fname”:”dongren”,”lname”:”zeng”}]}}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [

    {

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "fname" : "xiong",

        "lname" : "lan"

    },

    {

        "fname" : "xiong",

        "lname" : "lan"

    },

    {

        "fname" : "dongren",

        "lname" : "zeng"

    }

]

在修改语句中,我们想同时插入{“fname”:”xiong”,”lname”:”lan”},

{“fname”:”dongren”,”lname”:”zeng”}两个数据,但在原数组中,
{“fname”:”xiong”,”lname”:”lan”}这个数据已经存在,所以它只插入了后面那条。达到了我们想要的目的。所以,我个人更喜欢使用$addToSet

6.对其中的一部分进行操作

有时候数组有多个值,而我们只想对其中的一部分进行操作。如果我们把整个文档都抄下来,那太麻烦也太愚蠢了。好在mongodb给我们提供了两种简便方法:通过位置或者操作符“$”。下面我们来分别看看这两种方法怎么使用。首先是通过数组位置来操作。数组都是以0开头的,可以将下标直接作为键来选择元素。例如,我们想给数组的第一个数据加上年龄键值对,我们可以这么操作:

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$set:{“relationships.0.age”:22}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [

    {

        "age" : 22,

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "fname" : "deng",

        "lname" : "pan"

    },

    {

        "fname" : "xiong",

        "lname" : "lan"

    }

]

可是很多情况下,不预先查询文档我们就不知道要修改数组的元素的下标。这时定位操作符“$”就很好用了。它就是用来定位查询文档已匹配的元素,并进行更新。我们来看看它怎么用:

db.user.update({“relationships.fname”:”xiong”},{set:{"relationships..age”:22}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),

"age" : 23,

"favorite" : {

    "1" : "reading",

    "2" : "swimming",

    "3" : "listening music"

},

"fname" : "jeff",

"height" : 166,

"lname" : "jiang",

"relationships" : [

    {

        "age" : 22,

        "fname" : "qiang",

        "lname" : "he"

    },

    {

        "age" : 22,

        "fname" : "deng",

        "lname" : "pan"

    },

    {

        "age" : 22,

        "fname" : "xiong",

        "lname" : "lan"

    }

]

7 mongodb中$的作用

定义

定位符$的确定数组中一个要被更新的元素的位置,而不用具体指定该元素在数组中的位置。
用法

1.更新数组中的值
1)语法格式

{"<array>.$": value}

2)示例
创建集合students有以下文档:

db.students.insert([
   { "_id" : 1, "grades" : [ 85, 80, 80 ] },
   { "_id" : 2, "grades" : [ 88, 90, 92 ] },
   { "_id" : 3, "grades" : [ 85, 100, 90 ] }
])

将grades数组中第一个值为80更新为82,如果你不知道第一个值的具体位置,就可以像下面这样写:

db.students.updateOne(
   { _id: 1, grades: 80 },
   { $set: { "grades.$" : 82 } }
)

定位符$像一个占位符,匹配第一个符合查询条件的值的位置。
2.更新数组中的文档
定位符为更新那些包含嵌入文档的数组提供了方便。要取得嵌入文档中的字段属性值,在后面使用点符号。如一下语法格式描述

1)语法格式

db.collection.update(
   { <query selector> },
   { <update operator>: { "array.$.field" : value } }
)

2)举例
假设students集合中grades数组包含以下嵌入的文档:

{
  _id: 4,
  grades: [
     { grade: 80, mean: 75, std: 8 },
     { grade: 85, mean: 90, std: 5 },
     { grade: 85, mean: 85, std: 8 }
  ]
}

使用$定位符去更新grades数组中文档中字段std的值,被更新的文档是第一个匹配grade值为85的文档。如下:

db.students.updateOne(
   { _id: 4, "grades.grade": 85 },
   { $set: { "grades.$.std" : 6 } }
)

更新后的结果为:

{
   "_id" : 4,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 8 },
      { "grade" : 85, "mean" : 90, "std" : 6 },
      { "grade" : 85, "mean" : 85, "std" : 8 }
   ]
}