mongo
1、说明
SQL术语 | MongoDB术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table | joins | 表连接,MongoDB不支持 |
primary | key primary key | 主键,MongoDB自动将_id字段设置为主键 |
启动mongo /opt/sutech/mongodb ./bin/mongod --config mongo.conf
./bin/mongod --config /opt/sutech/mongodb/conf/mongo.conf
启动mongo
/opt/sutech/mongodb/bin/mongod --dbpath=/opt/sutech/mongodb/data --logpath=/opt/sutech/mongodb/logs --logappend --port=27017 --fork
登陆mongo
cd /opt/sutech/mongodb/bin
mongo
显示数据库 show dbs
显示集合(表) show collections
显示文档(行) db.test.find()
复制数据库 db.copyDatabase(<from_dbname>, <to_dbname>, <from_hostname>); 例如:db.copyDatabase('test','test1');
创建数据库
use test
db.test.insert({"name":"111"})
删除数据库
use test
db.dropDatabase()
按时间查询
db.getCollection('mongomessage').find({createTime:{$gt:ISODate("2018-06-28T22:00:00.000Z")}}).count
db.getCollection('mongomessage').find({fromAddress:'uc_b:(71133)一卡通余额提醒',createTime:{$gt:ISODate("2018-06-28T22:00:00.000Z")}}).count()
db.getCollection('mongomessage').find({fromAddress:'uc_b:(71135)学生课表信息提醒',createTime:{$gt:ISODate("2018-06-28")}}).count()
db.getCollection('mongomessage').find({fromAddress:'uc_b:(71134)教师课表信息提醒',createTime:{$gt:ISODate("2018-06-28T22:00:00.000Z")}}).count()
导出一个表(文档) E:\Program Files (x86)\mongo\bin>mongoexport -d ucpplus1 -c mongomsgbody -o e:\mongomsgbody.bak.json
导入一个表(文档) E:\Program Files (x86)\mongo\bin>mongoimport -d test -c mongo1 e:\mongomsgbody.bak.json
导出数据库(备份) E:\Program Files (x86)\mongo\bin>mongodump -d ucpplus1 -o e:\my_mongodb_dump
导入数据库(还原) E:\Program Files (x86)\mongo\bin>mongorestore -d ucpplus3 e:\ucpplus1_dump\ucpplus1
(还原时的数据目录必须是原来新建的目录与备份的数据库名称结合。数据库名称与原来一样是还原数据。数据库名称不一样会新建一个数据库)
https://www.cnblogs.com/qingtianyu2015/p/5968400.html
./mongodump -d ucpplus -o /home/mongobak/ucpplus/
{ "_id" : ObjectId("4e3f42f36266b5845052c03d"), "Bpid" : [ { "$ref" : "B", "$id" : ObjectId("4e3f3de16266b5845052c036") } ], "value" : 5 }
http://lhkzyz.iteye.com/blog/1669796
内嵌文档查询
db.teacher.find("$elemMatch":{"students.age":"15","students.hobby":"football"})
db.teacher.find({"students:"{"$elemMatch":{"age":"15","hobby":"football"}}})
正则查询 (忽略大小写)
db.getCollection('channelmessagestate').find({ "orignTo" : { "$regex" : ".*uc_u:\\(2\\).*" , "$options" : "i"} } )
db.getCollection('channelmessagestate').find({"recipientBy.address":{ "$regex" : ".*uc_u:\\(2\\).*" , "$options" : "i"} } )
http://www.runoob.com/mongodb/mongodb-query.html
排序 sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
db.getCollection('mongomessage').find({}).sort({"createTime":-1})
2、增删改查
1 列出并选用
1.1 列出所有数据库
> show dbs
local 0.000GB
myblog 0.000GB
1.2 使用某个数据库
> use myblog
switched to db myblog
查看数据库空间大小
db.stats(1073741824);//得到的是G单位的
1.3 列出所有集合
> show collections
articles
replicationColletion
sessions
users
wangduanduan
2 插入数据 insert(value)
// 在已经存在的集合中插入数据
> db.users.insert({name:'hh',age:23})
Inserted 1 record(s) in 43ms
// 在不存在的集合中插入数据,集合不存在则自动创建集合并插入
> db.students.insert({name:'hh',age:23})
Inserted 1 record(s) in 72ms
3 查询 find(option)
3.1 查询集合里所有的文档
> db.users.find()
/* 1 */
{
"_id" : ObjectId("583e908453be942d0c5419dc"),
"login_name" : "wangduanduan",
"password" : "wrong age"
}
/* 2 */
{
"_id" : ObjectId("583ed2a5cc9a937db049616d"),
"login_name" : "hh",
"password" : "sdfsdf"
}
/* 3 */
{
"_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
"name" : "wangduanduan",
"age" : 34.0
}
/* 4 */
{
"_id" : ObjectId("583fb707b12f8b7a7aa37573"),
"name" : "hh",
"age" : 23.0
}
3.2 按条件查询文档
> db.users.find({name:'wangduanduan'})
/* 1 */
{
"_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
"name" : "wangduanduan",
"age" : 34.0
}
注意
// 这是错的,查不到结果
> db.users.find({_id:'583fb2e9b12f8b7a7aa37572'})
Fetched 0 record(s) in 1ms
// 这是正确的
> db.users.find({_id:ObjectId('583fb2e9b12f8b7a7aa37572')})
/* 1 */
{
"_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
"name" : "wangduanduan",
"age" : 34.0
}
3.3 查询集合内文档的个数
> db.users.count()
4
3.4 比较运算符
$gt: 大于
$gte: 大于等于
$lt: 小于
$lte: 小于等于
$ne: 不等于
// 查询用户里年龄大于30岁的人, 其他条件以此类推
> db.user.find({age:{$gt:30}})
/* 1 */
{
"_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
"name" : "wangduanduan",
"age" : 34.0
}
3.5 逻辑运算符
3.5.1 与
// 查询名字是wangduanduan,age=34的用户
> db.users.find({name:'wangduanduan',age:34})
/* 1 */
{
"_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
"name" : "wangduanduan",
"age" : 34.0
}
3.5.2 $in 或
// 查询名字是wangduanduan,或hh的用户
> db.users.find({name:{$in:['wangduanduan','hh']}})
/* 1 */
{
"_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
"name" : "wangduanduan",
"age" : 34.0
}
3.5.3 $nin 非
// 查询名字不是wangduanduan或者hh的用户
> db.users.find({name:{$nin:['wangduanduan','hh']}})
/* 1 */
{
"_id" : ObjectId("583e908453be942d0c5419dc"),
"login_name" : "wangduanduan",
"password" : "wrong age"
}
/* 2 */
{
"_id" : ObjectId("583ed2a5cc9a937db049616d"),
"login_name" : "hh",
"password" : "sdfsdf"
}
3.6 正则匹配
// 查询名字是中含有duan的用户
> db.users.find({name:/duan/})
/* 1 */
{
"_id" : ObjectId("583fb2e9b12f8b7a7aa37572"),
"name" : "wangduanduan",
"age" : 34.0
}
/* 2 */
{
"_id" : ObjectId("583fc919b12f8b7a7aa37575"),
"name" : "wangduanduan",
"age" : 45.0
}
3.7 大招$where
// 返回含有login_name字段的文档
db.getCollection('users').find({$where:function(){
return !!this.login_name;
}})
4 更新 update();
4.1 整体更新
> db.users.update({login_name:'wangduanduan'},{name:'heihei',age:34})
Updated 1 existing record(s) in 116ms
4.2 $set 局部更新
// 只是将用户年龄设置成101
> db.users.update({name:'wangduanduan'},{$set:{age:101}})
4.3 $inc
// 将用户年龄增加1岁,如果文档没有age这个字段,则会增加这个字段
> db.users.update({name:'wangduanduan'},{$inc:{age:1}})
4.3 upsert操作
// 如果查不到文档,则增加文档
> db.users.update({name:'nobody'},{$inc:{age:1}},true)
Updated 1 new record(s) in 3ms
/* 6 */
{
"_id" : ObjectId("583fd20f2cfa6a4817c4171c"),
"name" : "nobody",
"age" : 1.0
}
db.student.update({"name":"李四","class":/大/},{$set:{"teacher":"老师","school":"行知学校"}})
$inc 就是专门用来增减数字的。且只能用于整型、长整型或者双精度浮点型的值。其他类型的数据会操作失败。
$inc 键的值必须为数字”,不能使用字符串、数组或者其他非数字的值。要修改其他类型,应该使用 $set 或者数字修改器。
4.4 批量更新
// upadate 的第四个参数设置成true的时候,就会批量更新
> db.users.update({name:'wangduanduan'},{$set:{age:1891}},false,true)
5 删除
// 删除某些文档
db.person.remove({"name":"joe"})
// 删除整个集合
db.test1.remove({}) 删除集合中的文档
db.test1.drop() 删除集合
3、内嵌文档
三种情况下mongo内嵌文档的查询与保存
1、内嵌文档(一个对象)
"recipientBy" : { // 发给用户时收件人类型、id、名称
"type" : 0,
"address" : "uc_u:(2)71070001"
}
https://segmentfault.com/q/1010000000710641/a-1020000000711864
查询语句可以简化一下,如下:
db.demo.find({"people_id" : 1, "albums.privilege": 5})
查询结果返回的是满足匹配条件的文档,虽然可以映射返回的字段,不过还真不能只返回你说的id为2和3的文档。不过既然已经得到了满足条件的json文档,可以写程序来获取想要的内嵌子文档吧。
更新语句如下:
db.demo.update({people_id:2, "albums.id":2}, { $set : {"albums.$.name":6 }})
db.demo.update({ "_id" : { "$oid" : "5ac2de789e15ae8da0b49493"}},{ "$set" : { "recipientBy.address" : "uc_b:(12)张hezi"}})
2、内嵌文档(数组内多个对象)
"mongoChannelTargets" : [ //收件对象
{
"channelIds" : [
3,
4
],
"address" : "uc_o:(8)金智", //收件人为机构
"type" : 0
},
{
"channelIds" : [
3,
4
],
"address" : "uc_u:(7)组用户1", //收件人为用户
"type" : 0
}]
https://blog.csdn.net/drifterj/article/details/7833883
db.blogs.find({"comment":{"$elemMatch":{"author":"joe", "score":{"$gte":3}}}});
https://blog.csdn.net/qq_20127333/article/details/51508863
操作符:$set修改数组中的元素
例句:db.blog.update({"comments.testAdd":"T"},{$set:{"comments.$.testAdd":"z"}});
这里注意第一个查询条件必须数组.字段名,否则修改失败,有人可能会问后面的{"comments.$.testAdd":"z"}中的$符是干嘛用的,他在这里面代表的相当于是数组的下表,如果我们明确的知道下标的话,我们完全可以这么写,比如下表为0:{"comments.0.testAdd":"z"},但大多数情况下我们是不知道下标的,所以用通配符$来表示,这样只会修改匹配的第一条数据,而不是所有匹配到的数据,这点需要注意
https://blog.csdn.net/leshami/article/details/55192965
db.students.update(
... { _id: 7, "grades.grade": 85 },
... { $set: { "grades.$.grade1" : 6 } })
db.demo.update(
{ "mongoChannelTargets.address" : "uc_u:(2)组用户111" , "_id" : { "$oid" : "5ac2de779e15ae8da0b49400"}},{ "$set" : { "mongoChannelTargets.$.address" : "uc_u:(11)张name"}})
3、内嵌文档(数组)
to" : [ //收件人类型、id、名称
"uc_o:(8)金智",
"uc_g:(3)3",
"uc_a:(4)通讯录1",
"uc_u:(3)徐",
"uc_u:(4)花",
"uc_u:(6)王",
"uc_u:(2)彭",
"uc_u:(7)组用户1",
"uc_b:(7)消息盒1"
]
https://blog.csdn.net/qingyuanluofeng/article/details/49148327
db.fruitshop.find({"fruits":{"$all":["apple","banana"]}});
{ "boxIds" : { "$all" : [ 8]}}
http://www.cnblogs.com/ginb/p/6200721.html