mongodb-数组字段的一些操作

有以下文档
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
        }
     ]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值