有以下文档
Student{
"_id": "1",
"Name":"张三",
"Books": [
{
"Name":"小狗钱钱",
"Price":18
},
{
"Name":"穷爸爸富爸爸",
"Price":20
}
]
}
Student{
"_id": "2",
"Name":"李四",
"Books": [
{
"Name":"第一本docker书",
"Price":33
},
{
"Name":"go程序设计语言",
"Price":30
}
]
}
插入元素
1、插入单个元素
db.Student.update({"_id":"1"}, {$addToSet:{"Books":{"Name":"C和指针","Price":10}}});
结果:
Student{
"_id": "1",
"Name":"张三",
"Books": [
{
"Name":"小狗钱钱",
"Price":18
},
{
"Name":"穷爸爸富爸爸",
"Price":20
},
{
"Name":"C和指针",
"Price":10
}
]
}
2、插入多个元素
db.Student.update(
{
"_id":"1"
},
{
$addToSet:{
"Books":[
{
"Name":"C和指针",
"Price":10
},
{
"Name":"流畅的python",
"Price":23
}
]
}
}
);
结果(明显不是我们想要的):
Student{
"_id": "1",
"Name":"张三",
"Books": [
{
"Name":"小狗钱钱",
"Price":18
},
{
"Name":"穷爸爸富爸爸",
"Price":20
},
[
{
"Name":"C和指针",
"Price":10
},
{
"Name":"流畅的python",
"Price":23
}
]
]
}
如果想要加入的数组元素挨个插入,需要配合 "$each" 使用
db.Student.update(
{
"_id":"1"
},
{
$addToSet:{
"Books":{
"$each":[
{
"Name":"C和指针",
"Price":10
},
{
"Name":"流畅的python",
"Price":23
}
]
}
}
}
);
结果:
Student{
"_id": "1",
"Name":"张三",
"Books": [
{
"Name":"小狗钱钱",
"Price":18
},
{
"Name":"穷爸爸富爸爸",
"Price":20
},
{
"Name":"C和指针",
"Price":10
},
{
"Name":"流畅的python",
"Price":23
}
]
}
3、$push
除了使用 $addToSet ,还能使用 $push。两者的区别是,$push往数组字段尾部追加元素,不管数组中是否存在相同元素;而 $addToSet 不添加已存在的元素
删除元素
删除元素使用 $pull 来实现
db.Student.update(
{
"_id":"1"
},
{
$pull:{
"Books":{
"$in":[
{
"Name":"小狗钱钱",
"Price":18
},
{
"Name":"流畅的python",
"Price":23
}
]
}
}
}
);
结果:
Student{
"_id": "1",
"Name":"张三",
"Books": [
{
"Name":"穷爸爸富爸爸",
"Price":20
}
]
}
查询元素
1、查找有 小狗钱钱 这本书的 Student
db.Student.find({"Books.Name" : "小狗钱钱"})
2、查找有 小狗钱钱、穷爸爸富爸爸 任意一本书的 Student
db.Student.find({"Books.Name" : {"$in":["小狗钱钱","穷爸爸富爸爸"]}})
3、查找有 小狗钱钱、穷爸爸富爸爸 两本书的 Student
db.Student.find({"Books.Name" : {"$all":["小狗钱钱","穷爸爸富爸爸"]}})
修改元素
修改 张三拥有的“小狗钱钱” 这本书修改为大狗钱钱,价格为38
db.Student.update(
{
"Name":"张三",
"Books.Name":"小狗钱钱"
},
{
$set:{
"Books.$":
{
"Name":"大狗钱钱",
"Price":38
},
}
}
);
结果:
Student{
"_id": "1",
"Name":"张三",
"Books": [
{
"Name":"大狗钱钱",
"Price":38
},
{
"Name":"穷爸爸富爸爸",
"Price":20
}
]
}
注意:Books后加 .$ ,是定位到 filter 匹配到的那个项,如果没有加,结果不正确
错误示范
db.Student.update(
{
"Name":"张三",
"Books.Name":"小狗钱钱"
},
{
$set:{
"Books":
{
"Name":"大狗钱钱",
"Price":38
},
}
}
);
错误结果:
Student{
"_id": "1",
"Name":"张三",
"Books": [
{
"Name":"大狗钱钱",
"Price":38
}
]
}