mongodb 操作命令
参考:https://www.cnblogs.com/cswuyg/p/4595799.html https://www.cnblogs.com/zhuminghui/p/8330429.html
https://blog.csdn.net/qq_48496502/article/details/124175432
MongoDB中,不用创建集合, 因为没有固定的结构, 直接使用db.集合名称.命令 来操作就可以了, 如果非要显示创建的话
使用: db.createCollection(“集合名称”)
注意:
1:没有显示指定 id 时, 会自动添加 id
2:MongoDB 每个文档大小不能超过16MB
3:可以使用 Object.bsonsize(“文档名”) 来看大小
1、shell登陆和显示
登陆:mongo --port 27017
显示DB:show dbs
进入某DB:use test_cswuyg
显示集合:show tables
2、文档添加
语法:
db.集合名.insertOne( 文档 ) : 往集合中插入一个文档
db.集合名.insertMany(文档):往集合中插入多个文档
db.集合名.insert( 文档 ) : 往集合中插入一个文档或者多个
db.users.insert({id: 1, name: "dafei", age: 18})
2、简单查找
查找文档:db.test_mac_id.find({'a': 'b'})
删除文档:db.test_mac_id.remove({'a': 'b'})
查找找到某一天的数据:
db.a.find({'D' : ISODate('2014-04-21T00:00:00Z')}) 或者 db.a.find({'D' : ISODate('2014-04-21')})
删除某一天的数据:
db.region_mac_id_result.remove({"D" : ISODate('2014-04-17')})
小于2014.6.5的数据:
db.xxx.find({E: {$lt :ISODate('2014-06-05')}})
大于等于2014.6.1的数据:
db.xxx.find({E: {$gte: ISODate("2014-05-29")}}).count()
两个条件:
db.xxx.find({E:{$gte: ISODate("2014-05-29"), $lte: ISODate("2014-06-04")}}).count()
json中的嵌套对象查询,采用“点”的方式:
mongos> db.wyg.find({"a.b": {$exists: true}})
{ "_id" : "c", "a" : { "b" : 10 } }
某个字段存在,且小于1000有多少:
db.stat.find({_: ISODate("2014-06-17"), "123": {$exists: 1, $lte: 1000}}, {"123": 1}).count()
批量修改字段
db.oa_verify.find({}).forEach(
function(item){
db.oa_verify.update({"_id":item._id},{"$set":{"updatetime":item.addtime}},false,true)
});
修改多条
db.collect.update({"zhaoshangrexian.电话类型":"1","pinpaimingcheng":"何老大"},{$set:{"pinpaimingcheng":"何老大"}},{multi:true})
聚合使用
db.collect.aggregate([ // aggregate方法接收的是一个数组
{
$group: {
_id: '$time',
num: {$sum: 1}
}
}
])
管道操作符
常用管道 含义
$group 将collection中的document分组,可用于统计结果
$match 过滤数据,只输出符合结果的文档
$project 修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)
$sort 将结果进行排序后输出
$limit 限制管道输出的结果个数
$skip 跳过制定数量的结果,并且返回剩下的结果
$unwind 将数组类型的字段进行拆分
表达式操作符
常用表达式 含义
$sum 计算总和,{$sum: 1}表示返回总和×1的值(即总和的数量),使用{$sum: '$制定字段'}也能直接获取制定字段的值的总和
$avg 平均值
$min min
$max max
$push 将结果文档中插入值到一个数组中
$first 根据文档的排序获取第一个文档数据
$last 同理,获取最后一个数据
按照time分组同时name存在数组中
db.collect.aggregate([ { $group: { _id: '$time', gameName: {$push: '$name'} } } ])
结果:
{ "_id" : 0.0, "gameName" : [ "ghost Recon", "farCry" ] }
$match 和 $group
db.collect.aggregate([ { $match: { time: {$gte: 20} } }, { $group: { _id: null, // _id: null表示全选 totalNum: {$sum: 1} } } ])
$project 投影
db.collect.aggregate([ { $project: { _id: 0, //不显示_id字段 } } ])
和我们直接写db.Ubisoft.find({},{'_id': 0})写法一样
db.collect.aggregate([ { $match: { time: {$gte: 20} } }, { $project: { _id: 0, // _id不显示 name: 1 // name是要显示的 } }, { $group: { _id: null, name: {$push: '$name'} } } ])
$sort
db.Ubisoft.aggregate([ { $sort: { time: -1 } } ])
$limit $skip
和limit()以及skip()的写法也是一样的。
db.collect.find().skip(1).limit(2) db.collect.aggregate([ { $skip: 1 }, { $limit: 2 } ])
$unwind
例子:
{ "_id" : ObjectId("5b0e242ed85f6f9cc56da7cc"), "name" : "gameList", "list" : [ "dota2", "csgo", "ow" ] } db.collect.aggregate([ { $unwind: '$list' // 指定list字段 } ])
可以看到,list为[],null,以及无指定字段的数据都丢失了,
为了不丢失数据,我们可以写成:
db.collect.aggregate([ { $unwind: { path: '$list', // path是指定字段 preserveNullAndEmptyArrays: true //该属性为true即保留 } } ])
$unset
删除集合中字段
db.collect.update({'name':'ls'},{$unset:{'score':''}})
子集操作
新增数据到子集中
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b')},{$addToSet:{child:{childId:3,type:3,name:'测试3'}}});
多条数据 $each
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b')},{$addToSet:{child:{$each:[{childId:3,type:3,name:'测试3'},{childId:4,type:4,name:'测试4'}]}}});
子集内容修改
//这里注意子集字段在查询条件直接是 父子段.子集字段 的形式,修改关键字是 父子段.$.子集字段
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b'),child.type:1},{$set:{child.$.name:"测试01"}})
子集删除
//删除数据{childId:1,type:1,name:'测试1'}
db.test.update({_id:ObjectId('62fc3dd6babacc41da59a94b')},{$pull:{child:{childId:1,type:1,name:'测试1'}}});
关联查询
参考:https://blog.csdn.net/yanyuan_1118/article/details/109526876
db.getCollection("note").aggregate(
[{
"$project":
{
"id":
{
"$convert": {
"input": "$_id",
"to": "string"
}
},
"noteCode": 1
}
}, {
"$lookup":
{
"from": "noteImage",
"localField": "id",
"foreignField": "noteId",
"as": "image_docs"
}
}]
);
db.getCollection("noteImage").aggregate(
[{
"$project":
{
"nid":
{
"$convert": {
"input": "$noteId",
"to": "objectId"
}
},
"imgId": 1
}
}, {
"$lookup":
{
"from": "note",
"localField": "nid",
"foreignField": "_id",
"as": "noteDocs"
}
}]
);