MongoDB 常用 Shell 命令
查询
根据ID查询
db.document.findOne({_id: ObjectId("")});
按属性查询
db.document.find({"": "", "": ""});
或查询
db.document.find({
$or: [
{"": ""},
{"": ""}
]
});
只查询需要的字段
db.document.find({}, {id: 1, '': 1});
查询某个字段为空的数据
db.document.find({"company.contractStatus": null}).limit(10);
过滤不需要的字段
db.document.find({}, {id: 0, '': 0});
指定字段去重
db.document.distinct('');
db.document.distinct('', {'': ''});
按字段排序(1正序、-1反序)、分页
db.document.find({}).sort({'': 1}).skip().limit();
统计数量
db.document.count();
db.document.find().count();
查询某个时间段内的数据
db.offer.find({createDate: { "$gte" : { "$date" : "2020-06-01T16:00:00.000Z"} , "$lte" : { "$date" : "2020-06-29T15:59:59.999Z"}}});
按字段分组统计
db.document.aggregate([
{$match: {'': ''}, {'': ''}},
{$group: {_id: {'': ''}, count: {$sum: 1}}}
])
例:
db.getCollection("position").aggregate([
{$match: {name: "安卓高级工程师"}},
{$group: {_id: {"name": "$name", "status": "$status"}, count: {$sum: 1}}},
{$match: {count: {$eq: 1}}},
{$project: {"field_name": "$_id.name", "field_status": "$_id.status", "field_count": "$count"}},
])
查询指定时间区间内
var date = {$gt: ISODate("2020-06-15T00:00:00.157+0800"), $lt: ISODate("2020-06-21T23:59:59.157+0800")};
db.user.find({"createDate" : date, authStatus: {$in: [1,2,11]}}).forEach(function(doc) {
print(doc.mobile + "," + (doc.trueName || "") + "," + (doc.nick || ""));
});
查询示例
db.getCollection("email_send").find({
fromMail: {$ne: "service@hunterplus.net"}, //fromMail不为service@hunterplus.net的
errorMessage: {$exists: true}, //errorMessage字段存在的
$where: "this.attachments.length > 0" //数组字段attachments长度大于0的
}).sort({sendDate: -1}); //按sendDate字段倒序排列
正则匹配
db.user.find({trueName: {"$regex": ".*韩莹.*"}});
更新
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
新增字段,为atest集合新增一个字段content
db.atest.update({},{$set:{content:""}},{multi:1})
删除uname字段
db.atest.update({},{$unset:{uname:""}},false,true)
修改字段,把content改为mcontent
db.atest.update({}, {$rename : {"content" : "mcontent"}}, false, true)
删除
带条件删除数据
db.user.remove({"name":"zhangshan"})
db.user.deleteMany({"name":"zhangshan"});
db.user.deleteOne({"name":"zhangshan"});
删除所有数据
db.user.remove({})
删除集合
db.user.drop()
删除 common 字段为空的所有数据
db.help_column.deleteMany({common:{$in:[null],$exists:false}})
聚合查询
分组统计
案例1
db.offer.aggregate([
{$group: {"_id": {positionId: "$positionId"}, count: {$sum: 1}}}, //根据positionId分组统计
{$match: {count: {$gt: 2}}} //对count进行过滤,只保留分组数量大于2的
]);
案例2:根据positionId分组统计,筛选出数量大于10的,再统计其数量
db.offer.aggregate([
{$group: {"_id": {positionId: "$positionId"}, count: {$sum: 1}, test: {$sum: 0}}},
{$match: {count: {$gt: 10}}},
{$group: {"_id": {test: "$test"}, total: {$sum: 1}}}
]);
案例3:日期操作
db.recommender.aggregate([
{$match: {companyId: '57ab1e018b56fe218db01ad7'}},
{
$project: {
positionName: 1,
companyName: 1,
createDate: 1,
sourceTimeString: {$dateToString: {format: "%Y-%m-%d", date: "$createDate"}}, //日期格式化
normalTime: {$add: ["$createDate", 8*60*60*1000]}, //时间运算,+8小时
normalTimeString: {$dateToString: {format: "%Y-%m-%d", date: {$add: ["$createDate", 8*60*60*1000]}}} //时间运算 + 格式化
}
}
]).forEach(function(data){
print(data.sourceTimeString + " , " + data.normalTimeString);
});
案例4:按时间分组统计
db.recommender.aggregate([
{$match: {companyId: '57ab1e018b56fe218db01ad7'}},
{
$project: {
positionName: 1,
companyName: 1,
createDate: 1,
sourceTimeString: {$dateToString: {format: "%Y-%m-%d", date: "$createDate"}}, //日期格式化
normalTime: {$add: ["$createDate", 8*60*60*1000]}, //时间运算,+8小时
normalTimeString: {$dateToString: {format: "%Y-%m-%d", date: {$add: ["$createDate", 8*60*60*1000]}}} //时间运算 + 格式化
}
},
{ $group: { _id: "$normalTimeString", count: { $sum: 1 }} },
]);
MongoDB 数据类型
根据数据类型查询
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})