修改字段名称
db.集合名称.update({}, {$rename:{"旧键名称":"新键名称"}}, false, true)
参数提示:
第一个false表示:可选,这个参数的意思是,如果不存在update的记录,true为插入新的记录,默认是false,不插入。
第二个true表示:可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
distinct的实现:
db.consumerecords.distinct("userId")
:键值去重 类似于mysql中的 select distinct userId from consumerecords
如果要计算去重后的数量,这个语句在大数据量的情况下不推荐使用,推荐使用如下语句
db.test.aggregate([{$group : {_id : "$userId", num_uerId: {$sum : 1}}}, {$count: "total_userId"}]);
db.consumerecords.distinct("userId",{act:"charge"})
:过滤之后去重,类似于mysql中的select distinct userId from consumerecords where act="charge"
db.consumerecords.distinct("userId").length
:去重之后求记录数,类似于mysql中的 select count(distinct userId) from consumerecords
count的实现
db.consumerecords.count()
:类似于 mysql中 select count(*) from consumerecords
db.consumerecords.count({act:"charge"})
:类似于mysql中的 select count(*) from consumerecords where act="charge"
- 根据字段值长度大小进行限制查询
- 使用 $where 查询(性能稍逊一些)
//查询商品名称长度大于25个字符的商品 db.item.find({item_name:{$exists:true},$where:"(this.item_name.length > 25)"}).limit(5) //查询商品名称长度小于5个字符的商品 db.item.find({$where:"this.item_name.length < 5"}).limit(5)
- 使用正则表达式查询(性能比$where 高)
//查询商品名称长度大于25个字符的商品 db.item.find({"item_name": {"$exists": true, "$regex": /^.{25,}$/}}).limit(5) //查询商品名称长度小于5个字符的商品 db.item.find({"item_name": {"$regex": /^.{0,5}$/}}).limit(5)
管道
-
$project
我们对上面的统计结果,只显示count,不想_id ,可以通过$project来操作,相当SQL的select 显示我们想要的字段:
db.items.aggregate([{$group:{_id:null,count:{$sum:1}}},{$project:{"_id":0,"count":1}}])
{ "count" : 8 }
-
$match
我们想通过滤订单中,想知道卖出的数量大于8的产品有哪些产品,相当于SQL:select sum(quantity) as total from items group by pnumber having total>8
db.items.aggregate([{$group:{_id:"$pnumber",total:{$sum:"$quantity"}}},{$match:{total:{$gt:8}}}])
一个复杂例子
db.getCollection('test').aggregate( [
{'$match': {'cardNum': {'$regex': '^310000'}}},
{'$project': {'cardNum':1, 'iname': 1}},
{'$group': { '_id': {'cardNum': '$cardNum', 'iname': '$iname'}, 'count': {'$sum': 1 }}},
{'$project': {'_id': 0, 'person': '$_id', 'count': 1}},
{'$sort': {'count': -1}},
{'$limit': 10}
]);
$push
的使用
插入单个
db.getCollection('test').update({source_id: '1'}, {$set: {'price': 4}, $push:
{
"histroy":{"price": 3, "date": 3}
}
}, true);
插入多个
db.getCollection('test').update({source_id: '1'}, {$set: {'price': 4}, $push:
{
"histroy": {"$each": [{"price": 3, "date": 3}, {"price": 2, "date": 2}]}
}
}, true);
字段的重命名,
即mysql
的as
操作
db['test'].aggregate([
{'$match': query},
{'$project': {
'arr1': {
'$map': {
"input": "$arr1",
'as': "sec",
'in': {
"col1_1": "$$sec.col1",
"re_name": "$name",
}
}
},
'update_time': '$updateTime'
}}
])
计算array item的长度
db['test'].aggregate([
{"$project":
{
"countArray1": {"$size": "$array1"},
"countArray2": {"$size": {"$ifNull": ["$array2", []]}},
}
}
])
数据导出
mongodump -h localhost:27017 -d yourdatabase -u yourusername -p yourpassword -o /home/bak
数据导入
mongorestore -h 127.0.0.1:27017 -d yourdatabase -u yourusername -p yourpassword /home/bak/yourdatabase
参考文章
https://blog.csdn.net/congcong68/article/details/51620040