shuijingping 发表于 2018-10-27 12:19:09

mongodb的简单操作

  {name:"MongoDB", type:"NoSQL"}
  ####关于NoSQL
  1.什么是NoSQL

  NoSQL,指非关系型的数据库。No>  2.为什么要使用NoSQL(http://robbin.iteye.com/blog/524977)
  对数据库的“三高”需求:
  1.高并发读写
  2.对海量数据的高效率读写
  3.高扩展性和高可用性
  关系型数据库的特性地位下降:
  1.事务一致性
  2.读写实时性
  3.复杂SQL,特别是多表关联查询
  对自己来说学习的目的主要是跟风,囧,很多招聘信息都要求熟悉MongoDB,个人的项目也无法体会到上面所说的优势,也体会不出关系型数据库的劣势,一个sqlite就可以让我的项目跑的风吼。不过,趁着年轻,多学一点。
  ####MongoDB简单操作(文档:http://cn.docs.mongodb.org/manual/)
  ######在Ubuntu上安装MongoDB:
  1.`sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10`
  2.`echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" >> /etc/apt/sources.list.d/10gen.list`
  3.`sudo apt-get update`
  4.`apt-get install mongodb-10gen`
  配置文件:/etc/mongodb.conf
  默认数据文件位置:/var/lib/mongodb
  默认日志文件位置:/var/log/mongodb
  默认监听端口:27017
  HTTP服务端口:监听端口+1000(http://localhost:28017)
http://t1.qpic.cn/mblogpic/d237f53b5a0275b8a408/2000.jpg
  默认web接口是不能使用里面的功能的,使用web接口要先建数据库目录,修改对象操作权限,再用对应参数如:--rest启动mongod
ashin@linux:~$ sudo mkdir -p /data/db  
ashin@linux:~$ sudo chmod 777 /data/db
  
ashin@linux:~$ mongod --rest
  ######开启与停止服务:
  开启:`sudo service mongodb start`
  停止:`sudo service mongodb stop`
  重启:`sudo service mongodb restart`
  运行javascript shell:`mongo` (help命令可以查看帮助信息)
http://t1.qpic.cn/mblogpic/37710f67ca86110df64a/2000.jpg
  MongoDB用文档保存数据(键/值):{"name":"ashin"}
  键不能含有\0,它表示键的结尾,.和$还有_均为保留符号。
  多个文档组成集合(集合类似于表,文档类似于行),多个集合组成数据库。
  进入shell默认连接的是test数据库,使用db命令可以查看当前正在使用的数据库,use DATABASENAME可以切换使用的数据库。使用show collections可以查看当前数据库有哪些集合。文档可以套嵌,值可以为数组,用{'key':}表示。
  ######简单CRUD:
> db    //显示当前连接的数据库  
test
  
> show collections//显示数据库中所有集合
  
system.indexes
  
test
  
things
  
> birthday = {'year':1992, 'month':12, 'day':26}    //创建文档
  
{ "year" : 1992, "month" : 12, "day" : 26 }
  
> db.ak.insert(birthday)    //把文档加入到ak集合中,ak集合在数据库中被创建
  
> show collections
  
ak
  
system.indexes
  
test
  
things
  
> db.ak.find()//查询集合中所有文档,Id的值由时间戳+机器+PID+计数器组成。
  
{ "_id" : ObjectId("51518c97862ecf1b9f562459"), "year" : 1992, "month" : 12, "day" : 26 }
  
> birthday.name="dog"
  
dog
  
> db.ak.update({'year':1992}, birthday) //更新修改文档
  
> db.ak.find()
  
{ "_id" : ObjectId("51518c97862ecf1b9f562459"), "year" : 1992, "month" : 12, "day" : 26, "name" : "dog" }
  
> db.ak.remove({"name":"dog"})//删除文档
  
> db.ak.find()
  
>
  
> dog={'sex':'F'}
  
{ "sex" : "F" }
  
> dog.birthday = birthday
  
{ "year" : 1992, "month" : 12, "day" : 26, "name" : "dog" }
  
> dog   //套嵌文档
  
{
  
"sex" : "F",
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
}
  
}
  
> dog.food = ['shit', 'maidong']    //使用数组
  
[ "shit", "maidong" ]
  
> dog.today = new Date()    //使用日期
  
ISODate("2013-03-26T12:17:17.045Z")
  
> dog
  
{
  
"sex" : "F",
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong"
  
],
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
>
  ######更新文档:
  $inc:对某个键的值加上指定的数
> db.ak.insert(dog)  
> db.ak.update({"birthday.year":1992}, {"$inc":{"birthday.day":2}})
  
> db.ak.findOne()
  
{
  
"_id" : ObjectId("5151959f862ecf1b9f56245a"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 28, //26+2
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  $set:指定一个键的值,不存在则创建它
  $unset:删除某个键
> db.ak.findOne({"birthday.day":28})  
{
  
"_id" : ObjectId("5151959f862ecf1b9f56245a"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 28,
  
"name" : "dog"
  
},
  
"day" : 2,//birthday.day写成了day造成的
  
"food" : [
  
"shit",
  
"maidong"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
> db.ak.update({"birthday.day":28}, {"$set":{"name":"cookie"}}) //添加/修改键的值
  
> db.ak.findOne({"birthday.day":28})
  
{
  
"_id" : ObjectId("5151959f862ecf1b9f56245a"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 28,
  
"name" : "dog"
  
},
  
"day" : 2,
  
"food" : [
  
"shit",
  
"maidong"
  
],
  
"name" : "cookie",
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
> db.ak.update({"birthday.day":28}, {"$unset":{"day":1}})   //删除指定键
  
> db.ak.findOne({"birthday.day":28})
  
{
  
"_id" : ObjectId("5151959f862ecf1b9f56245a"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 28,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong"
  
],
  
"name" : "cookie",
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
>
  $push:增加到数组
  $ne:不等于,不含有
> db.ak.update({"food" : {"$ne":"egg"}}, {"$push":{"food":"wow"}})//在food中不包含egg的文档中向food中加入wow  
> db.ak.find()
  
{ "_id" : ObjectId("5151959f862ecf1b9f56245a"), "birthday" : { "year" : 1992, "month" : 12, "day" : 28, "name" : "dog" }, "food" : [    "shit",   "maidong","moliqingcha","moliqingcha","maijie",   "maijie",   "egg" ], "name" : "cookie", "sex" : "F", "today" : ISODate("2013-03-26T12:17:17.045Z") }
  
{ "_id" : ObjectId("51519644862ecf1b9f56245b"), "birthday" : { "year" : 1992, "month" : 12, "day" : 26, "name" : "dog" }, "food" : [ "shit", "maidong", "maijie", "maijie", "wahaha", "wahaha", "wow" ], "sex" : "F", "today" : ISODate("2013-03-26T12:17:17.045Z") }
  
>
  $addToSet:添加到集合,确保不重复
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$addToSet":{"food":"pizza"}})    //添加到set  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong",
  
"maijie",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$addToSet":{"food":"pizza"}} )   //再次添加不会被添加
  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong",
  
"maijie",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
>
  $each:[]:对数组中每个元素执行前面的操作
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$addToSet":{"food":["pizza1","pizza2"]}} )   //为food添加一个数组  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong",
  
"maijie",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza",
  
[
  
"pizza1",
  
"pizza2"
  
]
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$addToSet":{"food":{"$each":["pizza1","pizza2"]}}} ) //$each将每个值添加到food数组中
  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong",
  
"maijie",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza",
  
[
  
"pizza1",
  
"pizza2"
  
],
  
"pizza1",
  
"pizza2"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
>
  $pop:删除数组任意一端的元素
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$pop":{"food":1}} )//删除food的最后一个元素  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong",
  
"maijie",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza",
  
[
  
"pizza1",
  
"pizza2"
  
],
  
"pizza1"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$pop":{"food":-1}} ) //删除food的第一个元素
  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"maidong",
  
"maijie",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza",
  
[
  
"pizza1",
  
"pizza2"
  
],
  
"pizza1"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
>
  数组下标定位
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$set":{"food.1":"maijie2"}}) //修改food的第二个元素  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"maidong",
  
"maijie2",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza",
  
[
  
"pizza1",
  
"pizza2"
  
],
  
"pizza1"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
> db.ak.update({"_id":ObjectId("51519644862ecf1b9f56245b")}, {"$set":{"food.7.0":"pizza0"}})    //修改food第8个元素的第一个值
  
> db.ak.findOne({"_id":ObjectId("51519644862ecf1b9f56245b")})
  
{
  
"_id" : ObjectId("51519644862ecf1b9f56245b"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 26,
  
"name" : "dog"
  
},
  
"food" : [
  
"maidong",
  
"maijie2",
  
"maijie",
  
"wahaha",
  
"wahaha",
  
"wow",
  
"pizza",
  
[
  
"pizza0",
  
"pizza2"
  
],
  
"pizza1"
  
],
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
>
  upsert:update函数第三个参数指定为true表示upsert,即如果要更新的文档存在则正常更新,不存在就新创建。
> db.ak.update({"birthday.day":29}, {"$inc":{"day":1}}) //普通update不存在的文档不会有变化  
> db.ak.find()
  
{ "_id" : ObjectId("5151959f862ecf1b9f56245a"), "birthday" : { "year" : 1992, "month" : 12, "day" : 28, "name" : "dog" }, "food" : [    "shit",   "maidong","moliqingcha","moliqingcha","maijie",   "maijie",   "egg" ], "name" : "cookie", "sex" : "F", "today" : ISODate("2013-03-26T12:17:17.045Z") }
  
{ "_id" : ObjectId("51519644862ecf1b9f56245b"), "birthday" : { "year" : 1992, "month" : 12, "day" : 26, "name" : "dog" }, "food" : [    "maidong","maijie2","maijie",   "wahaha",   "wahaha",   "wow","pizza",    [   "pizza0",   "pizza2" ],   "pizza1" ], "sex" : "F", "today" : ISODate("2013-03-26T12:17:17.045Z") }
  
> db.ak.update({"birthday.day":29}, {"$inc":{"day":1}}, true)   //upsert更新则会创建新文档
  
> db.ak.find()
  
{ "_id" : ObjectId("5151959f862ecf1b9f56245a"), "birthday" : { "year" : 1992, "month" : 12, "day" : 28, "name" : "dog" }, "food" : [    "shit",   "maidong","moliqingcha","moliqingcha","maijie",   "maijie",   "egg" ], "name" : "cookie", "sex" : "F", "today" : ISODate("2013-03-26T12:17:17.045Z") }
  
{ "_id" : ObjectId("51519644862ecf1b9f56245b"), "birthday" : { "year" : 1992, "month" : 12, "day" : 26, "name" : "dog" }, "food" : [    "maidong","maijie2","maijie",   "wahaha",   "wahaha",   "wow","pizza",    [   "pizza0",   "pizza2" ],   "pizza1" ], "sex" : "F", "today" : ISODate("2013-03-26T12:17:17.045Z") }
  
{ "_id" : ObjectId("51525958265b2c47d47147d3"), "birthday" : { "day" : 29 }, "day" : 1 }
  
>
  save:文档不存在则插入,存在就修改
> dog=db.ak.findOne()  
{
  
"_id" : ObjectId("5151959f862ecf1b9f56245a"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 28,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong",
  
"moliqingcha",
  
"moliqingcha",
  
"maijie",
  
"maijie",
  
"egg"
  
],
  
"name" : "cookie",
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z")
  
}
  
> dog.color = "gold"
  
gold
  
> db.ak.save(dog)
  
> dog=db.ak.findOne()
  
{
  
"_id" : ObjectId("5151959f862ecf1b9f56245a"),
  
"birthday" : {
  
"year" : 1992,
  
"month" : 12,
  
"day" : 28,
  
"name" : "dog"
  
},
  
"food" : [
  
"shit",
  
"maidong",
  
"moliqingcha",
  
"moliqingcha",
  
"maijie",
  
"maijie",
  
"egg"
  
],
  
"name" : "cookie",
  
"sex" : "F",
  
"today" : ISODate("2013-03-26T12:17:17.045Z"),
  
"color" : "gold"
  
}
  
>
  更新多个文档:
  默认更新只对符合匹配的第一个文档执行操作,要修改所有符合匹配的文档进行操作需要设置update的第四个参数为true
> db.things.find()  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65193"), "x" : 4, "j" : 1 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "x" : 4, "j" : 2 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "x" : 4, "j" : 3 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "x" : 4, "j" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "x" : 4, "j" : 5 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "x" : 4, "j" : 6 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "x" : 4, "j" : 7 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "x" : 4, "j" : 8 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519b"), "x" : 4, "j" : 9 }
  
> db.things.update({"x":4}, {"$set":{"k":0}})
  
> db.things.find()
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "x" : 4, "j" : 2 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "x" : 4, "j" : 3 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "x" : 4, "j" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "x" : 4, "j" : 5 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "x" : 4, "j" : 6 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "x" : 4, "j" : 7 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "x" : 4, "j" : 8 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519b"), "x" : 4, "j" : 9 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65193"), "j" : 1, "k" : 0, "x" : 4 } //只更新了j=1
  
> db.things.update({"x":4}, {"$set":{"k":0}}, false, true)
  
> db.things.find()//全部更新
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65193"), "j" : 1, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519b"), "j" : 9, "k" : 0, "x" : 4 }
  
>
  更新并返回文档:
  普通的update更新后不会有返回值,可以通过findAndModify命令来做
> db.runCommand({"findAndModify":"things","query":{"x":4},"sort":{"j":-1}, "update":{"$inc":{"k":1}}})  
{
  
"lastErrorObject" : {
  
"updatedExisting" : true,
  
"n" : 1,
  
"connectionId" : 5,
  
"err" : null,
  
"ok" : 1
  
},
  
"value" : {
  
"_id" : ObjectId("51512cf4c3bb8082f1b6519b"),
  
"j" : 9,
  
"k" : 0,
  
"x" : 4
  
},
  
"ok" : 1
  
}
  
> db.things.find()
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519b"), "j" : 9, "k" : 1, "x" : 4 }
  
> db.runCommand({"findAndModify":"things","query":{"x":4},"sort":{"j":-1}, "update":{"$inc":{"k":1}}}).value
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519b"), "j" : 9, "k" : 1, "x" : 4 }
  
> db.things.find()
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519b"), "j" : 9, "k" : 2, "x" : 4 }
  
> db.runCommand({"findAndModify":"things","query":{"k":2},"sort":{"j":1}, "remove":true}).value
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519b"), "j" : 9, "k" : 2, "x" : 4 }
  
> db.things.find()
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
>
  ######查询
  find():默认传递{}参数,{}匹配集合的全部内容
  find({}, {'key1':1, "key2":1}):只返回第二个参数指定的键,_id总是被返回
> db.things.find({}, {'k':1})  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "k" : 0 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "k" : 0 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "k" : 0 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "k" : 0 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "k" : 0 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "k" : 0 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "k" : 0 }
  
> db.things.find({}, {'k':1, '_id':0})
  
{ "k" : 0 }
  
{ "k" : 0 }
  
{ "k" : 0 }
  
{ "k" : 0 }
  
{ "k" : 0 }
  
{ "k" : 0 }
  
{ "k" : 0 }
  查询条件:
  "$lt", "$lte", "$gt", "$gte", "$ne", "$in", "$nin", "$or", "$not", "$mod"
> db.things.find({"j":{"$gte":3, "$lte":7}})  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
>
  
> db.things.find({"j":{"$in":}})
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
> db.things.find({"j":{"$nin":}})
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
> db.things.find({"j":{"$mod":}})//将查询的值除以第一个给定值,余数为第二个给定值则返回结果
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
> db.things.find({"j":{"$not":{"$mod":}}})
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
>
  正则表达式:
> db.things.find()  
{ "_id" : ObjectId("51526f5af1085f80823f7344"), "j" : "hello" }
  
{ "_id" : ObjectId("515270a7f1085f80823f7346"), "j" : "1hello" }
  
> db.things.find({"j":/hello/})
  
{ "_id" : ObjectId("51526f5af1085f80823f7344"), "j" : "hello" }
  
{ "_id" : ObjectId("515270a7f1085f80823f7346"), "j" : "1hello" }
  
> db.things.find({"j":/^hello/})
  
{ "_id" : ObjectId("51526f5af1085f80823f7344"), "j" : "hello" }
  
>
  查询数组:
> db.array.insert({'a':})  
> db.array.insert({'a':})
  
> db.array.insert({'a':})
  
> db.array.find({"a":})
  
> db.array.find({"a":{"$all":}})//通过多个元素来匹配数组必须用$all
  
{ "_id" : ObjectId("515272d9f1085f80823f7349"), "a" : [ 1, 2, 3 ] }
  
{ "_id" : ObjectId("515272dff1085f80823f734a"), "a" : [ 2, 3, 4 ] }
  
{ "_id" : ObjectId("515272e2f1085f80823f734b"), "a" : [ 2, 3, 1 ] }
  
> db.array.find({"a":}) //准确匹配,与位置有关
  
{ "_id" : ObjectId("515272d9f1085f80823f7349"), "a" : [ 1, 2, 3 ] }
  
> db.array.find({"a":[2,1,3rray.find({},{"a":{"$slice":2}}) //返回前2个元素
  
{ "_id" : ObjectId("515272d9f1085f80823f7349"), "a" : [ 1, 2 ] }
  
{ "_id" : ObjectId("515272dff1085f80823f734a"), "a" : [ 2, 3 ] }
  
{ "_id" : ObjectId("515272e2f1085f80823f734b"), "a" : [ 2, 3 ] }
  
> db.array.find({},{"a":{"$slice":-2}}) //返回后2个元素
  
{ "_id" : ObjectId("515272d9f1085f80823f7349"), "a" : [ 2, 3 ] }
  
{ "_id" : ObjectId("515272dff1085f80823f734a"), "a" : [ 3, 4 ] }
  
{ "_id" : ObjectId("515272e2f1085f80823f734b"), "a" : [ 3, 1 ] }
  
> db.array.find({},{"a":{"$slice":}})//返回第1个到第2个元素
  
{ "_id" : ObjectId("515272d9f1085f80823f7349"), "a" : [ 1, 2 ] }
  
{ "_id" : ObjectId("515272dff1085f80823f734a"), "a" : [ 2, 3 ] }
  
{ "_id" : ObjectId("515272e2f1085f80823f734b"), "a" : [ 2, 3 ] }
  $where执行任意javascript作为查询:
> db.things.find({"$where":function(){  
... for (i in this){
  
...   for (j in this){
  
...   if (i!=j && this == this){    //查找键不同但值相同的元素
  
...       return true;
  
...   }
  
...   }
  
... }
  
... }})
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
>
  游标:
> var c = db.things.find(); //必须用var声明  
> c.hasNext()
  
true
  
> while (c.hasNext()){
  
...   printjson(c.next())
  
... }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51526f5af1085f80823f7344"), "j" : "hello" }
  
{ "_id" : ObjectId("515270a7f1085f80823f7346"), "j" : "1hello" }
  
> db.things.find().limit(2) //指定返回个数上限
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
> db.things.find().skip(2)//略过指定个数
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51526f5af1085f80823f7344"), "j" : "hello" }
  
{ "_id" : ObjectId("515270a7f1085f80823f7346"), "j" : "1hello" }
  
> db.things.find().sort({'j':-1})   //1升序,-1降序
  
{ "_id" : ObjectId("51526f5af1085f80823f7344"), "j" : "hello" }
  
{ "_id" : ObjectId("515270a7f1085f80823f7346"), "j" : "1hello" }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b6519a"), "j" : 8, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65199"), "j" : 7, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65198"), "j" : 6, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65197"), "j" : 5, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65196"), "j" : 4, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65195"), "j" : 3, "k" : 0, "x" : 4 }
  
{ "_id" : ObjectId("51512cf4c3bb8082f1b65194"), "j" : 2, "k" : 0, "x" : 4 }
  
>
  聚合:
> db.array.find()  
{ "_id" : ObjectId("515272d9f1085f80823f7349"), "a" : [ 1, 2, 3 ] }
  
{ "_id" : ObjectId("515272dff1085f80823f734a"), "a" : [ 2, 3, 4 ] }
  
{ "_id" : ObjectId("515272e2f1085f80823f734b"), "a" : [ 2, 3, 1 ] }
  
> db.array.count()
  
3
  
> db.array.count({"a":})
  
1
  
> db.runCommand({"distinct":"array", "key":"a"})
  
{
  
"values" : [
  
1,
  
2,
  
3,
  
4
  
],
  
"stats" : {
  
"n" : 3,
  
"nscanned" : 3,
  
"nscannedObjects" : 3,
  
"timems" : 0,
  
"cursor" : "BasicCursor"
  
},
  
"ok" : 1
  
}
  分组:
> db.testgroup.find()  
{ "_id" : ObjectId("5157937e12ebc6d285bdf6c1"), "ka" : 1, "kb" : 2 }
  
{ "_id" : ObjectId("5157938512ebc6d285bdf6c2"), "ka" : 1, "kb" : 1 }
  
{ "_id" : ObjectId("5157938912ebc6d285bdf6c3"), "ka" : 1, "kb" : 1 }
  
{ "_id" : ObjectId("5157938f12ebc6d285bdf6c4"), "ka" : 1, "kb" : 1 }
  
{ "_id" : ObjectId("5157939512ebc6d285bdf6c5"), "ka" : 1, "kb" : 1 }
  
> db.testgroup.group({
  
"key":{"kb":1},
  
"initial":{count:0},
  
"reduce":function(currdoc, prevdoc){
  
prevdoc.count+=currdoc.ka }
  
})
  
[ { "kb" : 2, "count" : 1 }, { "kb" : 1, "count" : 4 } ]
  
>
  initial文档在reduce执行时,会作为初始文档传递给后续过程作为累加器文档,最后返回这个initial文档。
  reduce中系统会传递两个参数,当前文档和累加器文档。
  GridFS:
  GridFS用来存放大二进制文件
ashin@linux:~$ ls  
diskmongodb-note.txtopenshifttestVirtualBox VMsWallpaperworkspace公共的模板视频图片文档下载音乐桌面
  
ashin@linux:~$ mongofiles put mongodb-note.txt
  
connected to: 127.0.0.1
  
added file: { _id: ObjectId('51579c73e0af6265ff63802d'), filename: "mongodb-note.txt", chunkSize: 262144, uploadDate: new Date(1364696179568), md5:"6cd61341da1784b37e692c862ef4be45", length: 30615 }
  
done!
  
ashin@linux:~$ rm mongodb-note.txt
  
ashin@linux:~$ ls
  
diskopenshifttestVirtualBox VMsWallpaperworkspace公共的模板视频图片文档下载音乐桌面
  
ashin@linux:~$ mongofiles get mongodb-note.txt
  
connected to: 127.0.0.1
  
done write to: mongodb-note.txt
  
ashin@linux:~$ ls
  
diskmongodb-note.txtopenshifttestVirtualBox VMsWallpaperworkspace公共的模板视频图片文档下载音乐桌面
  
ashin@linux:~$
  ####主从复制
  主从复制可用于备份、故障恢复、读扩展等。设置一个主节点,多个从节点,从节点就可以复制主节点的数据到本地。
  在linux上的2612端口建一个主节点并设置为自动同步:`mongod --dbpath ./mongo/dbs/master/ --port 2612 --master --autoresync`
  在windows上7474端口建个从节点:`mongod.exe --dbpath c:\data\db --port 7474 --slave --source 192.168.2.130:2612`
  现在在主节点上添加数据,可以看到后台在打印同步信息,完成后到windows下去看,和主节点上的数据一样了。如果在从节点上添加数据的话,会提示not master。以从节点的身份运行mongo shell貌似不能连接上数据库,改成独立的mongod服务运行就好了。
  ####副本集
  副本集是有自动故障恢复功能的主从集群,区别是副本集没有固定的主节点。
  在192.168.2.130上创建数据库:`mongod --dbpath test/mongo/dbs/node2/ --port 10002 --replSet imsetname/192.168.2.108:10001`
  在192.168.2.108上创建数据库:`mongod --dbpath test/mongo/dbs/node1/ --port 10001 --replSet imsetname/192.168.2.130:10002`
  连接数据库初始化服务器:
  `mongo 192.168.2.130:10002/admin`
> db.runCommand({"replSetInitiate":{  
... "_id":"imsetname",
  
... "members":[
  
...   {
  
...   "_id":1,
  
...   "host":"192.168.2.130:10002"
  
...   },
  
...   {
  
...   "_id":2,
  
...   "host":"192.168.2.108:10001"
  
...   }
  
... ]}})
  
{
  
"info" : "Config now saved locally.Should come online in about a minute.",
  
"ok" : 1
  
}
  进入数据库提示符变为:`imsetname:PRIMARY> `表示是master节点,可以进行操作,断开再次连接发现提示符变成:`imsetname:SECONDARY> `,再进行操作会提示错误信息。master节点是不确定的,它由其他节点选举出来。读扩展可以放在从节点上查询减轻主节点负载。
  ####分片
  将数据库集合拆分,分散存在不同的机器上,mongodb可以自动进行分片。运行一个mongos路由进程,它知道所有数据存放的位置。
  启动配置服务器:
ashin@linux:~/test/mongo$ mkdir dbs/config  
ashin@linux:~/test/mongo$ mongod. --dbpath ./dbs/config --port 2612
  建立mongos进程:
ashin@linux:~/test/mongo$ mongos --port 2712 --configdb localhost:2612  添加分片(普通的mongod实例或副本集):
ashin@linux:~/test/mongo$ mkdir dbs/shard1  
ashin@linux:~/test/mongo$ mongod--dbpath dbs/shard1 --port 7777
  
ashin@linux:~/test/mongo$ mkdir dbs/shard2
  
ashin@linux:~/test/mongo$ mongod--dbpath dbs/shard2 --port 7778
  连接mongos,为集群添加片:
ashin@linux:~/test/mongo$ mongo localhost:2712/admin  
MongoDB shell version: 2.4.1
  
connecting to: localhost:2712/admin
  
mongos> db.runCommand({
  
... addshard:"localhost:7777",
  
... allowLocal:true //在localhost上运行片,生产环境中集群部署在不同的机器上
  
... })
  
{ "shardAdded" : "shard0000", "ok" : 1 }
  
mongos> db.runCommand({
  
... addshard:"localhost:7778",
  
... allowLocal:true
  
... })
  
{ "shardAdded" : "shard0001", "ok" : 1 }
  切分数据:
mongos> db.runCommand({"enablesharding":"shardtest"}) //将shardtest数据库的分片功能打开  
{ "ok" : 1 }
  
mongos> db.runCommand({"shardcollection":"shardtest.hehe", "key":{"_id":1}})    //对hehe集合按照_id来分片。
  
{ "collectionsharded" : "shardtest.hehe", "ok" : 1 }
  管理分片:
mongos> use config//切换到config数据库  
switched to db config
  
mongos> db.shards.find()    //查询分片
  
{ "_id" : "shard0000", "host" : "localhost:7777" }
  
{ "_id" : "shard0001", "host" : "localhost:7778" }
  
mongos> db.databases.find() //查询已经在片上的数据库信息,partitioned表示是否启用分片功能,primary表示数据库最开始创建数据文件的位置
  
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
  
{ "_id" : "test", "partitioned" : false, "primary" : "shard0000" }
  
{ "_id" : "shardtest", "partitioned" : true, "primary" : "shard0000" }
  
mongos> db.chunks.find()    //块信息
  
{ "_id" : "shardtest.hehe-_id_MinKey", "lastmod" : { "t" : 1, "i" : 0 }, "lastmodEpoch" : ObjectId("51592a6afbb6a0314bd6a9c7"), "ns" : "shardtest.hehe", "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : { "$maxKey" : 1 } }, "shard" : "shard0000" }
  
mongos> db.printShardingStatus()    //显示所有概要信息
  
--- Sharding Status ---
  
sharding version: {
  
"_id" : 1,
  
"version" : 3,
  
"minCompatibleVersion" : 3,
  
"currentVersion" : 4,
  
"clusterId" : ObjectId("51592728fbb6a0314bd6a939")
  
}
  
shards:
  
{"_id" : "shard0000","host" : "localhost:7777" }
  
{"_id" : "shard0001","host" : "localhost:7778" }
  
databases:
  
{"_id" : "admin","partitioned" : false,"primary" : "config" }
  
{"_id" : "test","partitioned" : false,"primary" : "shard0000" }
  
{"_id" : "shardtest","partitioned" : true,"primary" : "shard0000" }
  
shardtest.hehe
  
shard key: { "_id" : 1 }
  
chunks:
  
shard00001
  
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 { "t" : 1, "i" : 0 }
  
mongos> use admin   //删除分片
  
switched to db admin
  
mongos> db.runCommand({"removeshard":"localhost:7777"})
  
{
  
"msg" : "draining started successfully",
  
"state" : "started",
  
"shard" : "shard0000",
  
"note" : "you need to drop or movePrimary these databases",
  
"dbsToMove" : [
  
"shardtest",
  
"test"
  
],
  
"ok" : 1
  
}
  先在mongos中插入数据后,在7777上可以查到,7778上没有数据,删除7777后,7778上有了数据。数据量太小的原因。
  MongoDB有个0day,run操作可以直接执行shell命令。
  文章为阿小信的个人笔记,转载请注明出处。


页: [1]
查看完整版本: mongodb的简单操作