Mongodb 数据操作

作者: dawsonenjoy | 来源:发表于2018-09-29 16:20 被阅读0次

    1.查询

    (1)find()

    基本格式:

    db.集合.find({筛选条件}, {返回字段})
    

    查询符合条件的信息,如果没有加入条件,默认查询集合里所有信息,返回字段代表只返回的内容(默认_id字段一定会返回,如果不希望返回_id,则设置_id:0),0代表不返回这些字段,1代表只返回这些字段,举例:

    > db.news.find();
    #查询news集合里的所有信息
    > db.news.find({"new" : "aaa" });
    { "_id" : ObjectId("5b4b007eab406006cc8230cb"), "new" : "aaa" }
    #查询news集合里有:{"new" : "aaa" }键值对的数据
    > db.news.find({_id:1, abc:2});
    { "_id" : 1, "new" : [ "aaa" ], "abc" : 2 }
    #查询news集合里有:{_id:1, abc:2}键值对的数据
    > db.aaa.find({"aaa":"aaa"}, {"bbb":0})
    { "_id" : ObjectId("5ba25ee3be821c8cafbbdadb"), "aaa" : "aaa", "ccc" : "eee" }
    { "_id" : ObjectId("5ba25f00be821c8cafbbdadd"), "aaa" : "aaa", "ccc" : "eee" }
    #查询aaa集合里有{"aaa":"aaa"}的内容,返回的结果不包含"bbb"字段
    > db.aaa.find({"aaa":"aaa"}, {"bbb":1})
    { "_id" : ObjectId("5ba25ee3be821c8cafbbdadb"), "bbb" : "ddd" }
    { "_id" : ObjectId("5ba25f00be821c8cafbbdadd"), "bbb" : "bbb" }
    #查询aaa集合里有{"aaa":"aaa"}的内容,返回的结果只有_id和"bbb"字段
    > db.aaa.find({}, {"bbb":1})
    #查询aaa集合里所有数据,返回的结果只有_id和"bbb"字段
    

    注:筛选条件里有键值冲突时,如:{name:"111",name:"aaa"},则后一个会将前一个覆盖,即只会按后一个条件进行筛选

    (2)findOne()

    基本格式:

    db.集合.findOne({筛选条件})
    

    查询,可选是否填键值对条件,不填默认集合里第一条,举例:

    > db.news.findOne();
    #查询news集合里的第一条数据
    > db.aaa.findOne({"aaa":"aaa"})
    #查询news集合里含{"aaa":"aaa"}键值对的第一条数据
    

    2.修改

    (1)update({},{})

    基本格式:

    db.集合.update({筛选条件}, {更新的数据})
    

    匹配符合的数据,然后将内容更新成{更新的数据}里的内容,举例:

    > db.news.update({_id:1},{"qqq":"ccc", aaa:"kkk"});
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    #将_id为1的数据更新内容为:{"qqq":"ccc", aaa:"kkk"},即将原来内容覆盖
    

    上面是根据_id来筛选数据并更新的,如果是根据其他不唯一的键值对来更新时,其并不会对全部符合条件的都更新,而是只更新第一个符合条件的数据。

    (2)update({},{$set:{}})

    基本格式:

    db.集合.update({筛选条件}, {$set:{修改的数据}})
    

    匹配符合的数据,修改里面的键值对,存在的键值对就修改值,不存在的就新添值,举例:

    > db.aaa.update({"aaa":"aaa"}, {$set:{"ccc":"cccd","ddd":"bbb"}})
    #此时含有{"aaa":"aaa"}键值对的第一条数据假如内容为:{"aaa":"aaa", "ccc":"aaa"}
    #那么修改后就为:{"aaa":"aaa", "ccc":"cccd","ddd":"bbb"},即和更新不同,不会覆盖原内容
    
    (3)update({},{},0,0)

    基本格式:

    db.集合.update({筛选条件}, {更新的数据}, 0/1, 0/1)
    

    格式1里只能更新匹配到的第一条数据,如果要全部更新的话,就要用到格式2,update()方法里有四个参数,除了前两个必须的(筛选的数据和更新成的数据),第三个参数代表当没有符合的数据时是否新增数据,1代表新增,0代表不增;第四个参数代表匹配到多个符合的数据时,是否全部更新,0代表只更新第一条,1代表全部更新,两个参数都默认值为0,举例:

    > db.news.update({bbbb:"sadas"},{$set: {bbbb:"qqqqq"}}, 0, 1)
    WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
    #匹配符合{bbbb:"sadas"}的数据,没查到就不新增(相当于没发生啥),查到就全部修改,可以看到结果集里匹配到了3个,修改了3个
    
    (4)update({},{},{upsert:true})

    基本格式:

    db.集合.update({筛选条件}, {更新的数据},{upsert:true})
    

    虽然也是对数据进行更新,但是由于有upsert参数(update+insert,默认为false),所以当要修改的数据不存在时就追加,存在时就更新(原来数据不存在时相当于什么都没发生),举例:

    > db.aaa.update({_id:"4"}, {"bbc":"lll"}, {upsert:true})
    #原来没有_id为"4"的,此时就添加一条{_id:"4", "bbc":"lll"}记录
    

    3.插入

    (1)insert()

    基本格式:

    db.集合.insert({添加的数据})
    

    举例:

    > db.collection1.insert({name:"aaa",age:20})
    WriteResult({ "nInserted" : 1 })
    #往集合collection1里插入数据,如果不存在该集合就创建一个
    

    4.删除

    (1)remove()

    基本格式:

    db.集合.remove({删除的数据条件})
    

    删除集合里符合条件的数据,举例:

    > db.aaa.remove({"aaa":"ccc"})
    WriteResult({ "nRemoved" : 3 })
    #把含有{"aaa":"ccc"}键值对的数据都删了
    

    注:每句按分号隔离,单句没有分号也能执行,但是加分号更好

    5.索引

    (1)createIndex()

    基本格式:

    db.集合. createIndex({字段:1})
    

    为字段建立普通索引,1代表数据以该索引字段进行升序排序,-1代表降序,举例:

    db.aaa. createIndex({age:1})
    #为age字段建立普通索引,并升序排序
    

    注:ensureIndex()是3.0.0版本前创建索引方法,现在也还能用

    (2)createIndex({},{})

    基本格式:

    db.集合. createIndex({字段:1},{unique:true})
    

    为字段建立唯一索引,建立后,该字段的值都不能有重复,举例:

    db.aaa. createIndex({age:1},{unique:true})
    #为age字段建立唯一索引,之后所有的age都不能相同
    
    (3)getIndexes()

    基本格式:

    db.集合.getIndexes()
    

    获取当前集合的所有索引,举例:

    > db.aaa.getIndexes()
    #获取集合aaa的所有索引
    
    (4)dropIndex()

    基本格式:

    db.集合. dropIndex ({字段:1})
    

    将字段索引删除,举例:

    db.aaa. dropIndex ({age:1})
    #里面的字段和值要和创建索引时的一样才行,比如创建索引里是{age:100},那这里删除索引时括号里也要是{age:100}
    

    6.语句示范

    (1)逻辑操作

    > db.aaa.find({"_id": {$gte: 1}})
    { "_id" : 2, "aaa" : -7, "rank" : 0.6, "lll" : "ddd" }
    { "_id" : 3, "bbc" : "lll" }
    #_id大于等于1
    > db.aaa.find({$or:[{"title":/^a/}, {"title":/^b/}]})
    #"title"字段开头为a或b的
    > db.aaa.find({title:{$in: ["abc3","abc5", "abc100"]}})
    #"title"字段值为["abc3","abc5", "abc100"]这三个之一的
    > db.aaa.find({"title":{$exists:true}})
    #只要有"title"字段的都展示
    
    (2)运算操作

    像前面的加、乘、改名、新增/修改字段、删除字段等语法一般都是结合update使用,举例:

    > db.aaa.update({_id:"2"}, {$inc:{aaa:-3}, $mul:{rank:5}})
    #aaa字段值加3,rank字段值乘5
    > db.aaa.update({_id:"2"}, {$inc:{aaa:-3}, $mul:{rank:1/5}})
    #...减3,...除5
    > db.aaa.update({_id:"2"}, {$rename:{"bbb":"lll"}})
    #将bbb字段改名为"lll"
    > db.aaa.find({_id:"2"})
    { "_id" : "2", "aaa" : 2, "bbb" : "ddd", "ccc" : "eee" }
    #原本数据
    > db.aaa.update({_id:"2"}, {$set:{aaa:2,rank:3}, $unset:{"ccc":true}})
    #修改aaa字段,添加rank字段,删除ccc字段
    > db.aaa.find({_id:"2"})
    { "_id" : "2", "aaa" : 2, "bbb" : "ddd", "rank" : 3 }
    #修改后数据
    
    (3)for

    Mongodb语言和js语言相似,所以也可以使用for循环这类语句,举例:

    > for(i = 5; i<10 ; i++){db.aaa.insert({"title":"abc"+i})}
    
    (4)if

    判断语句,举例:

    > for(i = 50; i<100 ; i++){if(i==66){db.aaa.insert({"title":"abc"+i})}}
    
    (5)正则表达式
    > db.aaa.find({"title":/./})
    #找含有"title"字段,值为任意的
    > db.aaa.find({"title":/\d\d/})
    #找含有"title"字段,值中有连续两个数字的
    > db.aaa.find({"title":/^b/})
    #找含有"title"字段,值开头为"b"的
    

    7.其他方法

    (1)count()

    基本格式:

    db.集合.count()
    

    计算集合里的数据量,举例:

    > db.aaa.count()
    7
    
    (2)sort()

    基本格式:

    db.集合.find().sort({字段})
    

    将查询的数据结果按某个字段进行排序,值为1代表升序,-1代表降序,举例:

    > db.aaa.find({}, {"bbb":1}).sort({_id:1})
    #查询结果按_id进行升序排序
    
    (3)distinct()

    将所有集合里含有该字段的值排序表示出来,举例:

    > db.aaa.find()
    { "_id" : "4", "dbc" : "lll" }
    { "_id" : "3", "bbc" : "lll" }
    { "_id" : ObjectId("5ba5f2c4ae2521e9094641f2"), "title" : "abc3" }
    { "_id" : ObjectId("5ba5f2c4ae2521e9094641f3"), "title" : "abc4" }
    { "_id" : ObjectId("5ba5f3c7ae2521e9094641f9"), "title" : "abc66" }
    #现在有3个数据有"title"字段
    > db.aaa.distinct("title")
    [ "abc3", "abc4", "abc66" ]
    
    (4)limit()

    显示结果的条数,举例:

    > db.aaa.find({"title":/^a/}).skip().limit(2)
    { "_id" : ObjectId("5ba5f2c4ae2521e9094641f2"), "title" : "abc3" }
    { "_id" : ObjectId("5ba5f2c4ae2521e9094641f3"), "title" : "abc4" }
    #只返回前两个结果
    
    (5)skip()

    跳过前几条记录,一般和limit()配合使用,举例:

    > db.aaa.find({"title":/^a/}).skip(5).limit(2)
    { "_id" : ObjectId("5ba5f2f8ae2521e9094641f7"), "title" : "abc8" }
    { "_id" : ObjectId("5ba5f2f8ae2521e9094641f8"), "title" : "abc9" }
    #跳过前五条,所以这里显示的是6、7条
    

    相关文章

      网友评论

        本文标题:Mongodb 数据操作

        本文链接:https://www.haomeiwen.com/subject/wchboftx.html