• mongodb安装与增删改查


    一、安装

    安装包地址:https://www.mongodb.com/download-center/enterprise

    直接双击安装,不过得选择自定义安装,便于找到你自己的目录位置。

    我选择的路径是:G:MongoDB

    配置环境变量:G:MongoDBin

    启动mongodb服务端:

    mongod --dbpath G:MongoDBdatadb --port 27017 --bind_ip 127.0.0.1  #必须指定数据库文件夹的位置。
    

    客户端连接.

    mongo --port 27017 --host 127.0.0.1
    

    每次使用mongodb时,都需要启动数据库,非常麻烦,我们可以设置mongo为系统服务,让其在后台自动运行,

    注意配置服务操作,必须用管理员权限的命令窗口。

    创建目录
        ‪md G:MongoDBdata #有的话,可以不创建。
        md G:MongoDBlog #存放日志的文件夹。
    安装服务
        mongod --dbpath G:MongoDBdatadb --logpath  G:MongoDBloglog.log  --logappend  --serviceName MongoDB --bind_ip 0.0.0.0 --install
    移除服务
        mongod --dbpath G:MongoDBdatadb --logpath  G:MongoDBloglog.log  --logappend  --serviceName MongoDB --bind_ip 0.0.0.0 --remove
    
    启动服务
        net start MongoDB
        
    关闭服务
        net stop MongoDB
    

    二、基本命令

    2.1、关系型数据库与mongodb对应关系
    mysql         mongodb
    db               db
    tables         collections
    row(行)         document
    colum(列)       field
    
    2.2、基本操作
    use db 使用数据库,
    show dbs 查看当前多有的数据库
    show tables 查看数据表(collections)
    db 查看当前使用的是哪一个数据库
    db.createCollection('user') #创建user表(集合)
    db.dropDatabase() #删除当前使用的数据库
    db.info.drop() 删除表
    

    三、增删改查

    3.1、增加
    #单条数据插入(insertOne)
    > db.user.insertOne({name:'zs'})
    {
            "acknowledged" : true,
            "insertedId" : ObjectId("5e81d622d99e6fe305451329")
    }
    #多条数据插入(insertMany)
    > db.user.insertMany([{name:'erha'},{name:'huahua',age:18}])
    {
            "acknowledged" : true,
            "insertedIds" : [
                    ObjectId("5e81d683d99e6fe30545132a"),
                    ObjectId("5e81d683d99e6fe30545132b")
            ]
    }
    #既可以插入单条数据,也可以插入多条数据(insert)
    > db.goods.insert()
    
    3.2、查询
    数据准备
    [{"goods_id": 1, "cat_id": 4, "goods_name": "KD876", "goods_number": 1, "click_count": 7, "shop_price": 1388.0, "add_time": 1240902890}, {"goods_id": 4, "cat_id": 8, "goods_name": "诺基亚N85原装充电器", "goods_number": 17, "click_count": 0, "shop_price": 58.0, "add_time": 1241422402}, {"goods_id": 3, "cat_id": 8, "goods_name": "诺基亚原装5800耳机", "goods_number": 24, "click_count": 3, "shop_price": 68.0, "add_time": 1241422082}, {"goods_id": 5, "cat_id": 11, "goods_name": "索爱原装M2卡读卡器", "goods_number": 8, "click_count": 3, "shop_price": 20.0, "add_time": 1241422518}, {"goods_id": 6, "cat_id": 11, "goods_name": "胜创KINGMAX内存卡", "goods_number": 15, "click_count": 0, "shop_price": 42.0, "add_time": 1241422573}, {"goods_id": 7, "cat_id": 8, "goods_name": "诺基亚N85原装立体声耳机HS-82", "goods_number": 20, "click_count": 0, "shop_price": 100.0, "add_time": 1241422785}, {"goods_id": 8, "cat_id": 3, "goods_name": "飞利浦9@9v", "goods_number": 1, "click_count": 9, "shop_price": 399.0, "add_time": 1241425512}, {"goods_id": 9, "cat_id": 3, "goods_name": "诺基亚E66", "goods_number": 4, "click_count": 20, "shop_price": 2298.0, "add_time": 1241511871}, {"goods_id": 10, "cat_id": 3, "goods_name": "索爱C702c", "goods_number": 7, "click_count": 11, "shop_price": 1328.0, "add_time": 1241965622}, {"goods_id": 11, "cat_id": 3, "goods_name": "索爱C702c", "goods_number": 1, "click_count": 0, "shop_price": 1300.0, "add_time": 1241966951}, {"goods_id": 12, "cat_id": 3, "goods_name": "摩托罗拉A810", "goods_number": 8, "click_count": 13, "shop_price": 983.0, "add_time": 1245297652}]
    
    3.2.1、方法使用
    #查询一个满足条件的数据(findOne({条件},{显示的列}))
    > db.goods.findOne()
    {
            "_id" : ObjectId("5e81eb281753c31a4979041f"),
            "goods_id" : 1,
            "cat_id" : 4,
            "goods_name" : "KD876",
            "goods_number" : 1,
            "click_count" : 7,
            "shop_price" : 1388,
            "add_time" : 1240902890
    }
    #查询所有满足条件的数据(findOne({条件},{显示的列}))
    > db.goods.find({},{"goods_name":1,"_id":0})
    { "goods_name" : "KD876" }
    { "goods_name" : "诺基亚N85原装充电器" }
    { "goods_name" : "诺基亚原装5800耳机" }
    { "goods_name" : "索爱原装M2卡读卡器" }
    { "goods_name" : "胜创KINGMAX内存卡" }
    { "goods_name" : "诺基亚N85原装立体声耳机HS-82" }
    { "goods_name" : "飞利浦9@9v" }
    { "goods_name" : "诺基亚E66" }
    { "goods_name" : "索爱C702c" }
    { "goods_name" : "索爱C702c" }
    { "goods_name" : "摩托罗拉A810" }
    
    3.2.2、查询条件

    1、查询goods_id 为5的商品名

    > db.goods.find({goods_id:5},{goods_name:1})
    { "_id" : ObjectId("5e81eb281753c31a49790422"), "goods_name" : "索爱原装M2卡读卡器" }
    

    2、查询 goods_id 大于10的商品名

    > db.goods.find({goods_id:{$gt:10}},{goods_name:1})
    { "_id" : ObjectId("5e81eb281753c31a49790428"), "goods_name" : "索爱C702c" }
    { "_id" : ObjectId("5e81eb281753c31a49790429"), "goods_name" : "摩托罗拉A810" }
    

    3、小于($lt),不等于($ne),小于等于($lte),大于等于($gte)

    > db.goods.findOne({goods_id:{$ne:10}},{goods_name:1})
    { "_id" : ObjectId("5e81eb281753c31a4979041f"), "goods_name" : "KD876"
    

    4、在其中($in),不在其中($nin)

    > db.goods.findOne({goods_id:{$in:[1,2,3]}},{goods_name:1})
    { "_id" : ObjectId("5e81eb281753c31a4979041f"), "goods_name" : "KD876" }
    > db.goods.findOne({goods_id:{$nin:[1,2,3]}},{goods_name:1})
    {
            "_id" : ObjectId("5e81eb281753c31a49790420"),
            "goods_name" : "诺基亚N85原装充电器"
    }
    

    5、所有都需要满足($all)

    > use student
    switched to db student
    > db.info.insert({name:"erha",hoppy:[1,2,3]})
    WriteResult({ "nInserted" : 1 })
    > db.info.find({hoppy:{$all:[1,2]}}) #对应数组内的都需要满足。  
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha", "hoppy" : [ 1, 2, 3 ] }
    

    6、存在性($exists)

    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha", "hoppy" : [ 1, 2, 3 ] }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    > db.info.find({hoppy:{$exists:0}})
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    > db.info.find({hoppy:{$exists:1}})
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha", "hoppy" : [ 1, 2, 3 ] }
    

    7、逻辑非 ($nor),逻辑与 ($and),逻辑或 ($or),使用方法一致

    #取出商品id大于5小于10的商品
    > db.goods.find({$and:[{goods_id:{$gt:5}},{goods_id:{$lt:10}}]}),{goods_id:1,goods_name:1,_id:0})
    { "goods_id" : 6, "goods_name" : "胜创KINGMAX内存卡" }
    { "goods_id" : 7, "goods_name" : "诺基亚N85原装立体声耳机HS-82" }
    { "goods_id" : 8, "goods_name" : "飞利浦9@9v" }
    { "goods_id" : 9, "goods_name" : "诺基亚E66" }
    
    #取出 cat_id 不等于3 且 cat_id 不等于11的商品
    > db.goods.find({cat_id:{$nin:[3,11]}})
    > db.goods.find({$nor:[{cat_id:3},{cat_id:11}]})
    > db.goods.find({$and:[{cat_id:{$ne:3}},{cat_id:{$ne:11}}]})
    
    #嵌套
    #取出 cat_id 为3,或者4,且价格 大于1000小于2000的商品
    > db.goods.find({$and:[{cat_id:{$in:[3,4]}},{$and:[{shop_price:{$gt:1000}},{shop_price:{$lt:2000}}]}]},{_id:0,cat_id:1,shop_price:1})
    { "cat_id" : 4, "shop_price" : 1388 }
    { "cat_id" : 3, "shop_price" : 1328 }
    { "cat_id" : 3, "shop_price" : 1300 }
    
    3.3、删除
    #1、删除一个(deleteOne({条件}))
    > db.goods.deleteOne({cat_id:{$in:[1,2,3]}})
    { "acknowledged" : true, "deletedCount" : 1 }
    #2、删除匹配到的全部(deleteOne({条件}))
    > db.goods.deleteMany({cat_id:3})
    { "acknowledged" : true, "deletedCount" : 3 }
    
    #此时在对cat_id=3的进行查询
    > db.goods.find({cat_id:3})
    >         #此时没得数据..
    
    3.4、更新
    #1、update({条件},{新值},{选项})既可以更新一个,也可以更新多个,但是不加限定的话,更新其实是文档替换。
    选项:{upsert:true/false},  为 True:有则改之,无则增加。为 False:有则改之,无则跳过。
    > db.info.update({name:"ngls"},{name:"nglszs"},{upsert:true})
    > db.info.update({name:"ngl"},{name:"nglsz"},{upsert:false})
    
    初始值如下
    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha", "hoppy" : [ 1, 2, 3 ] }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "name" : "zs", "age" : 18 }
    > db.info.update({name:"zs"},{name:"ls"})
    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha", "hoppy" : [ 1, 2, 3 ] }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "name" : "ls" }
    没有加限定的时候,就会进行文档替换,这并不是我们想看到的,我们需要借助修改器。
    
    > db.info.insert({name:'zs',age:18})
    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha", "hoppy" : [ 1, 2, 3 ] }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "name" : "ls" }
    { "_id" : ObjectId("5e8212e822a16007999bc723"), "name" : "zs", "age" : 18 }
    #修改器
    $set  #修改某个字段
    > db.info.update({name:"zs"},{$set:{name:"ww"}})
    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha", "hoppy" : [ 1, 2, 3 ] }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "name" : "ls" }
    { "_id" : ObjectId("5e8212e822a16007999bc723"), "name" : "ww", "age" : 18 }
    $unset #删除某个字段
    > db.info.update({name:"erha"},{$unset:{hoppy:1}})
    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha" }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "name" : "ls" }
    { "_id" : ObjectId("5e8212e822a16007999bc723"), "name" : "ww", "age" : 18 }
    $rename #重命名某个字段
    > db.info.update({name:"ls"},{$rename:{name:"neck"}})
    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha" }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "neck" : "ls" }
    { "_id" : ObjectId("5e8212e822a16007999bc723"), "name" : "ww", "age" : 18 }
    $inc    #自增长
    > db.info.update({name:"ww"},{$inc:{age:2}}) #每次增长2
    > db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha" }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "neck" : "ls" }
    { "_id" : ObjectId("5e8212e822a16007999bc723"), "name" : "ww", "age" : 20 }
    
    ## updateOne,updateMany,必须指定修改器,不然会报错。
    #2、更新一个(updateOne({条件},{新值}))
    > db.info.updateOne({name:'ww'},{$set:{name:"zl"}})
    >  db.info.find()
    { "_id" : ObjectId("5e8203c51753c31a4979042a"), "name" : "erha" }
    { "_id" : ObjectId("5e8205111753c31a4979042b"), "name" : "huahua" }
    { "_id" : ObjectId("5e82116d22a16007999bc722"), "neck" : "ls" }
    { "_id" : ObjectId("5e8212e822a16007999bc723"), "name" : "zl", "age" : 20 }
    #3、更新全部(updateMany({条件},{新值}))
    

    四、聚合操作(aggregate)

    4.1、管道

    MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

    • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
    • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
    • $limit:用来限制MongoDB聚合管道返回的文档数。
    • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
    • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
    • $group:将集合中的文档分组,可用于统计结果。
    • $sort:将输入文档排序后输出。
    • $geoNear:输出接近某一地理位置的有序文档。
    4.2、聚合
    表达式 描述
    $sum 计算总和。
    $avg 计算平均值
    $min 获取集合中所有文档对应值得最小值。
    $max 获取集合中所有文档对应值得最大值。
    $push 在结果文档中插入值到一个数组中。
    $addToSet 在结果文档中插入值到一个数组中,但不创建副本。
    $first 根据资源文档的排序获取第一个文档数据。
    $last 根据资源文档的排序获取最后一个文档数据
    4.3、格式
    db.集合名.aggregate([{管道1},{管道2})
    
    4.4、示例
    #查询不同 cat_id 下的商品数量。
    > db.goods.aggregate([{$group:{_id:"$cat_id",num:{$sum:1}}}])
    { "_id" : 4, "num" : 1 }
    { "_id" : 11, "num" : 2 }
    { "_id" : 8, "num" : 3 }
    
    #查询 该表下的商品数量
    > db.goods.find().count()
    6
    > db.goods.aggregate([{$group:{_id:null,num:{$sum:1}}}])
    { "_id" : null, "num" : 6 }
    
    #查询不同 cat_id 下商品价格大于 50 的商品数量
    > db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:"$cat_id",num:{$sum:1}}}])
    { "_id" : 4, "num" : 1 }
    { "_id" : 8, "num" : 3
    
    #查询不同 cat_id 下商品总库存
    > db.goods.aggregate([{$group:{_id:"$cat_id",num:{$sum:"$goods_number"}}}])
    { "_id" : 11, "num" : 23 }
    { "_id" : 4, "num" : 1 }
    { "_id" : 8, "num" : 61 }
    
    #查询不同 cat_id 下商品价格大于 50 的商品数量 并且每个类别下的数量大于2
    > db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:"$cat_id",num:{$sum:1}}},{$match:{num:{$gt:2}}}])
    { "_id" : 8, "num" : 3 }
    
    #查询不同 cat_id 下商品总库存,并且排序
    > db.goods.aggregate([{$group:{_id:"$cat_id",num:{$sum:"$goods_number"}}},{$sort:{num:1}}])
    { "_id" : 4, "num" : 1 }
    { "_id" : 11, "num" : 23 }
    { "_id" : 8, "num" : 61 }
    
    #查询不同 cat_id 下的平均价格,按照由高到低排序
    > db.goods.aggregate([{$group:{_id:"$cat_id",price:{$avg:"$shop_price"}}},{$sort:{price:-1}}])
    { "_id" : 4, "price" : 1388 }
    { "_id" : 8, "price" : 75.33333333333333 }
    { "_id" : 11, "price" : 31 }
    
    #查询不同 cat_id 下的平均价格,按照由高到低排序,只返回liangge
    db.goods.aggregate([{$group:{_id:"$cat_id",price:{$avg:"$shop_price"}}},{$sort:{price:-1}},{$limit:2}])
    { "_id" : 4, "price" : 1388 }
    { "_id" : 8, "price" : 75.33333333333333 }
    
  • 相关阅读:
    Python | PyQt5编写计时器与倒计时应用程序
    AI文件与PS文件相互导入,并分层可编辑
    maple解方程组
    有限元数值分析
    常用Latex编辑数学公式
    notion
    总结一下ANSYS中不同单元之间选择与连接问题
    参考文献的引用方法
    Abaqus CAE笔记本
    几种大文件传输的平台
  • 原文地址:https://www.cnblogs.com/hjnzs/p/12609479.html
Copyright © 2020-2023  润新知