首页 > 数据库技术 > 详细

mongodb_1

时间:2020-04-01 00:37:14      阅读:97      评论:0      收藏:0      [点我收藏+]

一、安装

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

技术分享图片

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

技术分享图片

我选择的路径是:G:\MongoDB

配置环境变量:G:\MongoDB\bin

启动mongodb服务端(--port 27017 --host 127.0.0.1 默认,不指定也可以):

mongod --dbpath G:\MongoDB\data\db --port 27017 --host 127.0.0.1  #必须指定数据库文件夹的位置。

客户端连接.

mongo --port 27017 --host 127.0.0.1

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

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

技术分享图片

创建目录
    ?md G:\MongoDB\data #有的话,可以不创建。
    md G:\MongoDB\log #存放日志的文件夹。
安装服务
    mongod --dbpath G:\MongoDB\data\db --logpath  G:\MongoDB\log\log.log  --logappend  --serviceName MongoDB  --install
移除服务
    mongod --dbpath F:\mongo\data\db --logpath  ?F:\mongo\log\log.log  --logappend  --serviceName MongoDB  --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 }

mongodb_1

原文:https://www.cnblogs.com/hjnzs/p/12609479.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!