mongodb 基础

一、首先安装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 }
}}
])

 

判断mongo属性存在性

利用这个句柄,会得到类似可以for i in cursor的格式,来进行处理。

 _____________________________________________________________

 场景:

    在命令手动的修改签到表的整型字段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"})

 
image.png

命令前:


 
image.png

命令后


 
image.png
$set 只更新字段

此操作只有在数据库有此条数据时 会和新设置的字段融合
db.menu_models.update({"AAAA":'rrrrr'},{$set:{"BBBB":"HHH"}})

 
image.png

 

命令前:


 
image.png

命令后:


 
image.png
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}
)
 
image.png

命令前:


 
image.png

命令后:


 
image.png
upsert 更新不存在则新增

添加upsert则更新文档不存在则新增一条新文档

命令:db.menu_models.update({"AAAA":'rrrrr'},{"BBBB":'CCC'},{upsert:true})

 
image.png

命令前:
数据库是没数据的

命令后


 
image.png
$set和upsert组合

命令:db.menu_models.update({"AAAA":'rrrrr'},{$set:{"BBBB":'CCC'}},{upsert:true})

 
 

命令前:
数据库是没数据的

命令后:


 
 
 
 
——————————————————————————————————————————————————————————————————————————
 
 

db.getCollection('NoteContent').find({"CreateDate" :{"$ge":ISODate("2018-09-07 02:26:55Z"),"$lte":ISODate("2018-09-07 02:26:56Z")}})

 

//查询一批用户在  2020-08-18  ---  2020-09-18 写过内容

 

db.getCollection('NoteContent').find({ "$and": [

    {"WNetId":{$in:[

        'W5815799036','W5815799042','W5815799043','W5815799044','W5815799046','W5815799047','W5815799050',

        'W5815799059','W5815799078','W5815799038','W5815799049','W5815799052','W5815799057','W5815799058',

        'W5815799061','W5815799062','W5815799069','W5815799072','W5815799074','W5815799075','W5815799076',

        'W5815799077','W5815799079','W5815799071','W5815799080','W5815799081','W5815799064'       

        ]}},

    {"CreateDate" :{"$gte":ISODate("2020-08-18 00:00:00Z")}},

    {"CreateDate" :{"$lte":ISODate("2020-09-18 00:00:00Z")}} 

    ]},

    {"WNetId":1,"NoteContentDetail":1,"CreateDate":1}

    )

   

posted @ 2020-02-10 14:31  kelelipeng  阅读(224)  评论(0编辑  收藏  举报