一、首先安装mongodb
1.下载地址:http://www.mongodb.org/downloads
2.解压缩到自己想要安装的目录,比如d:\mongodb
3.创建文件夹d:\mongodb\data\db、d:\mongodb\data\log,分别用来安装db和日志文件,在log文件夹下创建一个日志文件MongoDB.log,即d:\mongodb\data\log\MongoDB.log
4.运行cmd.exe进入dos命令界面,执行下列命令
> cd d:\mongodb\bin
> d:\mongodb\bin>mongod -dbpath "d:\mongodb\data\db"
看到类似的信息,则说明启动成功,默认MongoDB监听的端口是27017,mysql的是3306
5.测试连接
新开一个cmd窗口,进入mongodb的bin目录,输入mongo或者mongo.exe,出现如下信息说明测试通过,此时我们已经进入了test这个数据库,如何进入其他数据库下面会说。
输入exit或者ctrl+C可退出。
6.当mongod.exe被关闭时,mongo.exe 就无法连接到数据库了,因此每次想使用mongodb数据库都要开启mongod.exe程序,所以比较麻烦,此时我们可以将MongoDB安装为windows服务
还是运行cmd,进入bin文件夹,执行下列命令
> d:\mongodb\bin>mongod --dbpath "d:\mongodb\data\db" --logpath "d:\mongodb\data\log\MongoDB.log" --install --serviceName "MongoDB"
这里MongoDB.log就是开始建立的日志文件,--serviceName "MongoDB" 服务名为MongoDB
接着启动mongodb服务
>d:\mongodb\bin>NET START MongoDB
打开任务管理器,可以看到进程已经启动
7.关闭服务和删除进程
> d:\mongodb\bin>NET Stop MongoDB (关闭服务)
> d:\mongodb\bin>mongod --dbpath "d:\mongodb\data\db"
--logpath "d:\mongodb\data\log\MongoDB.log" --remove --serviceName "MongoDB"
(删除,注意不是--install了)
C:\Program Files\MongoDB\Server\3.6\bin>mongod.exe --dbpath D:\mongodb\data\db -
-logpath D:\mongodb\data\log\MongoDB.log -port 27017
连接客户端
mongo --host localhost --port 27017
--正则查询
db.mycol1.find({$or:[{"title":/FF/},{"title": "测试"}]}).pretty()
db.mycol1.find({"title":/^F/,"title":/F$/})
db.mycol1.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
清空集合
db.mycol.remove({})
db.col.remove({'title':'MongoDB 教程'})
如删除集合下全部文档:
(remove()方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法)
db.inventory.deleteMany({})
删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
update() 方法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
db.mycol1.update({"title":"测试"},{$inc:{"likes":1}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
db.mycol1.update({"title":"TTT"},{$inc:{"likes":1}},{upsert:true})
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5ae2b60f5999bf89e086b280")
})
""""
likes>50 and (by='菜鸟教程' or title like '%FF%' )
db.mycol1.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": /FF/}]}).pretty()
likes>50 and (by='菜鸟教程' and title like '%FF%' )
db.mycol1.find({"likes":{$gt:50},$and: [{"by": "菜鸟教程"},{"title": /测/}]}).pretty()()
likes>50 and likes<200
db.mycol1.find({"likes":{$gt:50,$lt:200} }).pretty()
$gt -------- greater than >
$gte --------- gt equal >=
$lt -------- less than <
$lte --------- lt equal <=
$ne ----------- not equal !=
$eq -------- equal =
db.users.find({}, {'name' : 1, 'skills' : 1});
db.mycol1.find({"likes":{$gt:50,$lt:200}} ,{"_id":1,"title":1}).pretty()
补充说明: 第一个{} 放where条件 第二个{} 指定那些列显示和不显示 (0表示不显示 1表示显示)
查找 title类型是 String的记录
db.mycol1.find({"title" : {$type : 2}})
类型 数字 备注
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已废弃。
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127
db.mycol1.find({},{"title":1,_id:0}).limit(2).skip(1)
db.mycol1.find({},{"title":1,_id:0}).limit(2).skip(1).sort({"title":-1})
{ "title" : "我的Title" }
{ "title" : "FFFFFFF" }
____________________________________________________________________
db.tt.insert([
{"name":"abc","age":"25","status":"zxc"},
{"name":"dec","age":"19","status":"qwe"},
{"name":"asd","age":"30","status":"nmn"},
])
db.tt.updateOne({"name":"abc"},{$set:{"age":"28"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
db.tt.find()
{ "_id" : ObjectId("5ae19005216046240c5b6a10"), "name" : "abc", "age" : "28", "status" : "zxc" }
{ "_id" : ObjectId("5ae19005216046240c5b6a11"), "name" : "dec", "age" : "19", "status" : "qwe" }
db.tt.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
db.tt.find()
{ "_id" : ObjectId("5ae19005216046240c5b6a10"), "name" : "abc", "age" : "28", "status" : "xyz" }
{ "_id" : ObjectId("5ae19005216046240c5b6a11"), "name" : "dec", "age" : "19", "status" : "xyz" }
{ "_id" : ObjectId("5ae19005216046240c5b6a12"), "name" : "asd", "age" : "30", "status" : "xyz" }
remove() 方法的基本语法格式如下所示:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
-- 删除所有满足条件
db.mycol1.remove({"title":"测试"})
-- 只删除一条
db.tt.remove({"age":{$gt:"20"}},1)
单字段索引:
db.tt.ensureIndex({"name":1})
使用多个字段创建复合索引
db.tt.ensureIndex({"name":1,"age":-1},{background:true})
TTL 索引
db.plane.createIndex({"CreateTM":1},{expireAfterSeconds:120})
唯一 索引
db.WWW.ensureIndex({Name:1,_id:1},{unique:true})
查询索引
db.WWW.getIndexes()
删除索引
db.WWW.dropIndex("MyIndexName")
db.tt.aggregate([{$group:{_id :"$name", num_tutorial : {$sum : 1}}}])
{ "_id" : "asd", "num_tutorial" : 1 }
{ "_id" : "dec", "num_tutorial" : 2 }
db.mycol1.aggregate([{$match:{likes:{$gt:0,$lte:150}}},{ $group: { _id:"$title",count:{$sum:1}}}])
{ "_id" : "测试", "count" : 2 }
{ "_id" : "FFFFFFF", "count" : 1 }
db.mycol1.aggregate({$group:{_id:"$title", total: {$sum:"$likes" } } } )
{ "_id" : 100, "total" : 0 }
{ "_id" : "我的Title", "total" : 0 }
{ "_id" : "测试", "total" : 101 }
{ "_id" : "FFFFFFF", "total" : 100 }
db.mycol1.count({"title":/T$/})
db.mycol1.group(
{
"key":{"title":true},
"initial":{"mytitle":[]},
"$reduce":function(cur,prev)
{
prev.mytitle.push(cur.title);
})
//http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html
//分组处理
db.mycol1.group({"key":{"title":true}, "initial":{"mytitle":[]} , "$reduce":function(cur,prev){prev.mytitle.push(cur.title);} })
//分组过滤及finalize处理
//condition: 这个就是过滤条件。
//finalize:这是个函数,每一组文档执行完后,多会触发此方法,那么在每组集合里面加上count也就是它的活了。
db.mycol1.group({"key":{"title":true}, "initial":{"mytitle":[]} , "$reduce":function(cur,prev){prev.mytitle.push(cur.title);},
"finalize":function(out){out.count=out.mytitle.length;}
})
//分组过滤及finalize处理
db.mycol1.group({"key":{"title":true}, "initial":{"mytitle":[]} , "$reduce":function(cur,prev){prev.mytitle.push(cur.title);},
"finalize":function(out){out.count=out.mytitle.length;},"condition":{"likes":{$gte:2}} })
mapReduce 操作
1>
var mf= function() {
emit(this.title,this.likes);
};
var rf= function(title, valuesPrices) {
return Array.sum(valuesPrices);
};
db.col.mapReduce(
mf,
rf,
{ out: "mrResult" }
)
> var list=db.mycol1.find()
> list.forEach(function(x) {print(x.title)} )
FFFFFFF
我的Title
100
TTT
for(var i=0;i<=100000;i++) {
var rnd=parseInt(i*Math.random());
db.person.insert({"name":"nm"+i,"age":i})
}
--分析执行效率
db.person.find({"name":"nm1010"}).explain()
db.person.ensureIndex({"name":1},{"unique":true})
db.person.find({"name":"nm100"})
{"_id" : ObjectId("5ae2cc80e50af5e37622f91e"), "name" : "nm100", "age" : 100 }
db.person.find({"name":"nm100"}).hint({"name":1}).explain()
--删除索引
> db.person.dropIndex("name_1")
{ "nIndexesWas" : 2, "ok" : 1 }
--备份数据库
>mongodump --port 27017 -d test -o c:\dbinfo
--还原数据库
>mongorestore --port 27017 -d test c:\dbinfo\test
> db.WWW.find( {"Persons.Name":{$in:["FBB4"]}}).pretty()
{
"_id" : ObjectId("5aec43b2d3a5122ab44097c0"),
"Name" : "Hello",
"Age" : 12,
"Info" : [
"111",
"222"
],
"Persons" : [
{
"Name" : "AAA0"
},
{
"Name" : "FBB4"
}
]
}
> db.WWW.find( {"Info":{$in:["222"]},$and:[ {"Persons.Name":{$in:["FBB4"]}} ] }).pretty()
{
"_id" : ObjectId("5aec43b2d3a5122ab44097c0"),
"Name" : "Hello",
"Age" : 12,
"Info" : [
"111",
"222"
],
"Persons" : [
{
"Name" : "AAA0"
},
{
"Name" : "FBB4"
}
]
}
> db.WWW.find( {"Info":{$in:["222"]},"Persons.Name":{$in:["FBB4"]} }).pretty()
{
"_id" : ObjectId("5aec43b2d3a5122ab44097c0"),
"Name" : "Hello",
"Age" : 12,
"Info" : [
"111",
"222"
],
"Persons" : [
{
"Name" : "AAA0"
},
{
"Name" : "FBB4"
}
]
}
https://www.cnblogs.com/wolf-sun/p/5972777.html
[Mongodb]删除指定字段
摘要
如果想要删除mongodb中一个document的某个字段,该如何做呢?
方法模版
db.user.update({"email_state":{"$exists":true}},{"$unset":{"email_state",""}},{multi:true});
删除user表的email_state字段。
模版:
db.表.update({"field1":{"$exists":true}},{"$unset":{"field1",""}},{multi:true})
$exists:判断存在该字段。
注意在后面需要加上multi:true,删除多行。
--判断重复记录
db.slice.aggregate([
{ $group: {
_id: { UserId: "$UserId", NodeKey: "$NodeKey" ,DocumentId:"$DocumentId",SliceIndex:"$SliceIndex" },
uniqueIds: { $addToSet: "$_id" },
count: { $sum: 1 }
}},
{ $match: {
count: { $gt: 1 }
}}
])
_____________________________________________________________
场景:
在命令手动的修改签到表的整型字段synState,multi参数是可以更新多条,如果是false则更新一条。
db.getCollection("ClassRecordOneDetail").update({synStateTime:{"$gt":new Date("2019-05-12")},synStateTime:{"$lt":new Date("2019-05-13")}},{$set:{synState:0}},{multi:true});
更新之后查询发现 synState 变为了 0.0 类型变为了 double
解决办法:
在网上找了一下,发现是要加上类型转换才行
db.getCollection("ClassRecordOneDetail").update({synStateTime:{"$gt":new Date("2019-05-12")},synStateTime:{"$lt":new Date("2019-05-13")}},{$set:{synState:NumberInt(0)}},{multi:true});
db.t_element_access_reason.find( { "sessionId" : NumberLong("6421359123204194756") } )
_______________________________________________________________________________________________
Mongodb 更新操作update
有则更新
此操作只有在数据库有此条数据时才更新
如下图 会将MENU_KEY这条数据整个更新掉
命令:
db.menu_models.update({"MENU_KEY":'rrrrr'},{"AAAA":"rrrrr"})
命令前:
命令后
$set 只更新字段
此操作只有在数据库有此条数据时 会和新设置的字段融合db.menu_models.update({"AAAA":'rrrrr'},{$set:{"BBBB":"HHH"}})
命令前:
命令后:
multi多行更新
以上的更新操作只会更新符合条件的一条记录 设置multi可以全部更新
注意:multi必须要与$set组合使用否则会报错:multi update only works with $ operators
命令:
db.menu_models.update({"AAAA":'rrrrr'},{$set:{"BBBB":'CCC'}},{multi:true})
多条件更新:
db.getCollection('test').update( {$or: [{c1:true}, {c2: true }] } , {$set: {rs: true }}, {multi:true} )
命令前:
命令后:
upsert 更新不存在则新增
添加upsert则更新文档不存在则新增一条新文档
命令:
db.menu_models.update({"AAAA":'rrrrr'},{"BBBB":'CCC'},{upsert:true})
命令前:
数据库是没数据的
命令后
$set和upsert组合
命令:
db.menu_models.update({"AAAA":'rrrrr'},{$set:{"BBBB":'CCC'}},{upsert:true})
命令前:
数据库是没数据的
命令后:
来源:oschina
链接:https://my.oschina.net/u/4396833/blog/4066277