MongoDB常用命令

Centos, Ubuntu, Nginx, MySQL, Redis, Mongodb, Docker, ...
Post Reply
User avatar
IOsetting
论坛管理员
论坛管理员
Posts: 3641
Joined: 2006-10-17 1:48

MongoDB常用命令

Post by IOsetting » 2018-12-11 20:03

查找

Code: Select all

# 列出所有
db.getCollection('article').find({})

# = 条件
db.getCollection('article').find({name : 'name'})

# and条件
db.getCollection('article').find({name:'name', age:18});

# or条件
db.getCollection('article').find({$or:[{title:/release/}, {title:/Faq/}]}, {title:1})article

# in条件
db.getCollection('article_756').find({author:{$in:['david', 'Bens', 'xxh']}})

# like 条件(正则), 注意这里的正则字符串是不加引号的
db.getCollection('article').find({name : /ThisName/})
# like 忽略大小写
db.getCollection('article').find({name : /ThisName/i})
db.getCollection('article').find({_id : /^756.*/})

# 列出指定字段
db.getCollection('article').find({}, {name: 1, rank: 1})

# 不列出指定字段
db.getCollection('article').find({}, {name: 0, rank: 0})

# 排序, 1: ASC, -1: DESC
db.getCollection('article').find({}).sort({updatedAt: -1})

# 翻页 limit, skip
db.getCollection('article').find({}).limit(20).skip(20000)
注意: 排序时, 如果 MongoDB 在排序的字段上不能使用索引, 所有记录的合并大小不能超过32MB

修改值
替换_id字段的值. 如果只是修改值, 可以在原表上修改(save一个, remove一个),

Code: Select all

# 注意这边 _id 的类型是 int32, 所以 这个等式右边是有问题的, 最后会被转为int
db.getCollection('article').find({}).forEach( function(u) {
    var old = u._id;
    u._id = u.boardId+'.'+u._id;
    db.getCollection('article').save(u);
    db.getCollection('article').remove({_id, ObjectId(old)});
})
如果是同时修改类型和值, 不能在原表上直接修改, 要新建一个collection来处理.

注意: 这个在Robo3T里面执行会报错, 必须到命令行下面执行

# 修改collection名称
db.getCollection('article').renameCollection('article_old')

# 将新记录填入新collection
db.getCollection('article_old').find({}).forEach( function(u) {
    var newId = u.boardId.toString() +'.'+ u._id.toString();
    u._id = newId;
    u.parentId = u.boardId.toString() +'.'+ u.parentId.toString();
    db.getCollection('article').save(u);
})
修改和删除字段名

Code: Select all

#格式
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 :可选,抛出异常的级别。
修改字段名

Code: Select all

db.getCollection('article').update({},{$rename:{"COMMPP":'COMP_NAME'}},false,true)
删除字段

Code: Select all

//把 from等于hengduan 并且zhLatin是空的数据的zhLatin字段删除
db.getCollection('species').update({"from":"hengduan","zhLatin":null},{$unset: {'zhLatin':''}},false, true)
删除

删collection

Code: Select all

db.getCollection('section_to_board').drop()
删记录, 对应_id的值可以是ObjectId, string, int 等

Code: Select all

db.getCollection('article').remove({_id: ObjectId("adfasdfadsf")})
db.getCollection('article').remove({board: 'name')})

索引
Mongodb 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex()

Code: Select all

# 创建联合唯一索引, 方式为后台创建, 不阻塞
db.collection.ensureIndex( {"id":1,"name":1}, {background:1,unique:1} )
# 创建索引
db.collection.createIndex( { orderDate: 1 } )
# 指定索引名称, 如果未指定, MongoDB 通过连接索引的字段名和排序顺序生成一个索引名称
db.collection.createIndex( { category: 1 }, { name: "category_fr" } )
# 创建联合索引
db.collection.createIndex( { orderDate: 1, category: 1 }, { name: "date_category_fr", collation: { locale: "fr", strength: 2 } } )

# 查看集合索引
db.collection.getIndexes()
# 查看集合索引大小
db.collection.totalIndexSize()
# 删除集合所有索引
db.collection.dropIndexes()
# 删除集合指定索引
db.collection.dropIndex("索引名称")

统计
主要是count, distinct 和 group

Code: Select all

# 统计记录数 count
db.getCollection('article').find({name:'name', age:18}).count()

# Distinct
# 格式 db.collectionName.distinct(field, query, options)
# 统计所有的记录中flag的不同值, flag要加引号
db.getCollection('article').distinct(flag)
# 带条件的distinct, 去author为gre的flag的不同值
db.getCollection('article').distinct('flag', {author: 'gre'})

# Group 实际上是一种 MapReduce 方式的统计
# 对于如下结构的数据进行统计
{
 "_id" : ObjectId("552a333f05c2b62c01cff50e"),
 "_class" : "com.mongo.model.Orders",
 "onumber" : "004",
 "date" : ISODate("2014-01-05T16:03:00Z"),
 "cname" : "zcy",
 "item" : {
   "quantity" : 5,
   "price" : 4.0,
   "pnumber" : "p002"
  }
}

# 按date和pnumber对记录进行分组, 在reduce中累计quantity, 会输出key 和out中的字段
db.orders.group({
    key: { date:1,'item.pnumber':1 },
    initial: {"total":0},
    reduce: function Reduce(doc, out) {
        out.total+=doc.item.quantity
    }
})

# 按date对记录进行分组, 在reduce中统计数量和金额, 最后再补充计算单件平均价格
db.orders.group({
    key: {date:1},
    initial: {"total":0,"money":0},
    reduce: function Reduce(doc, out) {
        out.total+=doc.item.quantity;
        out.money+=doc.item.quantity*doc.item.price;
    },
    finalize : function Finalize(out) {
        out.avg=out.money/out.total
        return out;
    }
});
注意: group命令不能在分片集合上运行, group的结果集大小不能超过16MB

聚合
执行相同的统计, aggregate 性能比group好

Code: Select all

# 关键词含义, 注意以$开头的关键字, 以及字段名
$sum	计算总和。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg	计算平均值	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min	获取集合中所有文档对应值得最小值。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max	获取集合中所有文档对应值得最大值。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push	在结果文档中插入值到一个数组中。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet	在结果文档中插入值到一个数组中,但不创建副本。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first	根据资源文档的排序获取第一个文档数据。	db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last	根据资源文档的排序获取最后一个文档数据	db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
统计文章数量

Code: Select all

db.getCollection('article').aggregate([{$group : {_id : "$author", num_articles : {$sum : 1}}}])
等价于

Code: Select all

db.getCollection('article_756').group({
    key: {author:1},
    initial: {"total":0},
    reduce: function Reduce(doc, out) {
        out.total += 1;
    },
    finalize : function Finalize(out) {
        out.avg = out.total / 100
        return out;
    }
});
带条件的统计

Code: Select all

db.getCollection('article').aggregate([
    {$match: { author: 'Milton' }},
    {$group: { _id: "$boardId", total: { $sum: 1 } } },
    {$sort: { total: -1 } }
])

Post Reply