• Mongodb对内嵌数组的增删改


    首先构造一些数据

    1 db.student.insert({
    2     name:'hunter',
    3     courses:[{  name:'英语',   classRoom:'1001'},{  name:'高等数学',   classRoom:'1001'}]
    4 })

     1、新增操作,往courses新增一个课程

    db.student.update({name:'hunter'},{ $addToSet: {courses:{ name:'复变函数',  classRoom:'1002'} } })

     重复执行一下以上指令,发现并没有再新增一个课程,相同的数据只写入一次。

     那么要插入重复元素怎么处理,用关键字$push替代$addToSet,其他的不变,执行完后,可以发现,数据里有两门一样的复变函数课程。

    db.student.update({name:'hunter'},{ $push: {courses:{ name:'复变函数',  classRoom:'1002'} } })

     2、删除操作

    下面来看看把复变函数这门课程进行删除

    使用$pull

    db.student.update({name:'hunter'},{ $pull: {courses:{ name:'复变函数',  classRoom:'1002'} } })

    执行完之后,会发现,关于复变函数的两条记录均被删除了,$pull会把匹配的数据全部删除。

    使用$pop操作符,该使用场景应该还是比较少的

    db.student.update({name:'hunter'},{ $pop: {courses:1 } })

    该操作会把在数组的最后一个元素进行删除,如果把1修改成-1,那么删除的数组的第一个元素。

    3、修改操作

    db.student.update({name:'hunter','courses.name':'英语'},{ $set: {'courses.$.classRoom':'1008'} })

    $set操作符执行后,如果记录匹配到多条,用$只进行了第一个元素的更改,需要多条修改那么用$[],如果指定下标修改,那么把$修改为元素的下标即可,索引从0开始,update修改也只是修改匹配的第一条记录,如果要多条,使用updateMany()或者options设置为multi:true;

     4、查询

    假设当前数据是这样的。

    {name:'hunter',courses:[{  name:'英语',   classRoom:'1001'},{  name:'复变函数',   classRoom:'1001'}]
    {name:'tom',courses:[{  name:'英语',   classRoom:'1001'},{  name:'复变函数',   classRoom:'1002'}]

    这个查询全部的记录都会查出来。

    db.student.find({'courses.classRoom':'1001','courses.name':'复变函数'})

    严格匹配查询,这样只有hunter的记录能查询出来。

    //匹配出正确的文档
    
    db.student.find({'courses':{$elemMatch:{'classRoom':'1001','name':'复变函数'}}})
    //这个是匹配出正确的文档后,再筛选指定的数据,find的第二个参数是个project,虽然与查询参数是一样的,作用倒是不同。
    
    db.student.find({'courses':{$elemMatch:{'classRoom':'1001','name':'复变函数'}}},{'courses':{$elemMatch:{'classRoom':'1001','name':'复变函数'}}})
  • 相关阅读:
    ANDROID – 單色漸層效果的改良 – GRADIENT SCRIMS(转)
    ANDROID – TOOLBAR 上的 NAVIGATION DRAWER(转)
    ANDROID – TOOLBAR STEP BY STEP(转)
    Android设计和开发系列第二篇:Action Bar(Develop—Training)
    Android设计和开发系列第二篇:Action Bar(Develop—API Guides)
    Android设计和开发系列第二篇:Action Bar(Design)
    Android英文文档翻译系列(6)——LocalBroadcastManager
    Android设计和开发系列第一篇:Notifications通知(Develop—API Guides)
    Android设计和开发系列第一篇:Notifications通知(Develop—Training)
    Apache与Nginx虚拟主机设置(多域名和多端口的区别)
  • 原文地址:https://www.cnblogs.com/hunter2014/p/9018967.html
Copyright © 2020-2023  润新知