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 }
]
}