mongo常用操作总结

MongDB常用操作总结

MongoDB的安装详见另外教程

一、mongoDB入门

操作 对应的命令
显示数据库列表 show dbs
切换/创建数据库
当创建一个集合(table)的时候会自动创建当前数据库
use yourDB
显示当前数据库中的集合
类似关系数据库中的表
show collections
Help查看命令提示 db.help()
db.yourColl.help()
db.youColl.find().help();
删除当前使用数据库 db.dropDatabase();
从指定主机上克隆数据库
将指定机器上的数据库的数据克隆到当前数据库
db.cloneDatabase(“127.0.0.1”);
从指定的机器上复制指定数据库数据到某个数据库
将本机的mydb的数据复制到temp数据库中
db.copyDatabase(“mydb”, “temp”, “127.0.0.1”);
修复当前数据库 db.repairDatabase();
查看当前使用的数据库 db.getName();
显示当前db状态 db.stats();
当前db版本 db.version();
查看当前db的链接机器地址 db.getMongo();
添加联合索引 db.test.createIndex({CONTENT_SN:1,SUBJECT_SN:1})
查询索引 db.test.getIndexes()
查看总索引记录大小 db.test.totalIndexSize();
读取当前集合的所有index信息 db.test.reIndex();
删除指定索引 db.test.dropIndex(“name_1”);
删除所有索引 db.test.dropIndexes();

二、mongoDB查询

1. 查询所有记录

//相当于select* from test
db.test.find({
    
    })

2. 查询去重后的当前集合中的某列的数据

//过滤掉test中name相同的数据
//相当于select distict name from test
db.test.distinct("name");

3. 查询指定记录

描述 mongo脚本 等同于sql
查询age = 22的记录 db.userInfo.find({“age”: 22}); select * from userInfo where age = 22;
查询age > 22的记录 db.userInfo.find({age: {$gt: 22}}); select * from userInfo where age >22;
查询age < 22的记录 db.userInfo.find({age: {$lt: 22}}); select * from userInfo where age <22;
查询age >= 25的记录 db.userInfo.find({age: {$gte: 25}}); select * from userInfo where age >= 25;
查询age <= 25的记录 db.userInfo.find({age: {$lte: 25}}); select * from userInfo where age <= 25;
查询age >= 23 并且 age <= 26 db.userInfo.find({age: {$gte: 23, $lte: 26}}); select * from userInfo where age >= 23 and age<=26;
查询name中包含 mongo的数据 db.userInfo.find({name: /mongo/}); select * from userInfo where name like ‘%mongo%’;
查询name中以mongo开头的 db.userInfo.find({name: /^mongo/}); select * from userInfo where name like ‘mongo%’;
查询指定列name、age数据
name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息
db.userInfo.find({}, {name: 1, age: 1}); 相当于:select name, age from userInfo;
只查询某列 db.BASE_ADMISSIONS.find({},{SUBJECT_SN:1,_id:0})
查询指定列name、age数据, age > 25 db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1}); select name, age from userInfo where age >25;
按照年龄升序 db.userInfo.find().sort({age: 1}); select * from userInfo order by age asc;
按照年龄降序 db.userInfo.find().sort({age: -1}); select * from userInfo order by age desc;
查询name = zhangsan, age = 22的数据 db.userInfo.find({name: ‘zhangsan’, age: 22}); select * from userInfo where name = ‘zhangsan’ and age = ‘22’;
查询前5条数据 db.userInfo.find().limit(5); select * from userInfo limit 5;
查询10条以后的数据 db.userInfo.find().skip(10); select * from userInfo where id not in ( select * from userInfo limit 10);
查询在5-10之间的数据
可用于分页,limit是pageSize,skip是第几页*pageSize
db.userInfo.find().limit(10).skip(5); select * from userInfo limit 5,10;
or与 查询 db.userInfo.find({$or: [{age: 22}, {age: 25}]}); select * from userInfo where age = 22 or age = 25;
查询第一条数据 db.userInfo.findOne();
db.userInfo.find().limit(1);
select * from userInfo limit 1;
查询某个结果集的记录条数 db.userInfo.find({age: {$gte: 25}}).count(); select count(*) from userInfo where age >= 20;
按照某列查询记录条数 db.userInfo.find({***: {$exists: true}}).count(); select count(***) from userInfo;
包含$in:满足其中一个元素的数据 db.userInfo.find({age: { $in:[13,73]}}) select * from userInfo where age in (13,73);
不包含$in:满足值不为任何指定元素的数据 db.userInfo.find({age: { $nin:[13,73]}}) select * from userInfo where age not in (13,73);

三、mongoDB为集合新增字段、修改字段、删除字段

  1. 新增字段

//为test集合新增一个字段content
db.test.update({
    
    },{
    
    $set:{
    
    content:""}},{
    
    multi:1})
  • 说明:第一个{}代表查询条件。$set代表更新字段,与mysql中的set类似。multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
  1. 修改字段

//修改test的content字段为mcontent字段
db.test.update({
    
    }, {
    
    $rename : {
    
    "content" : "mcontent"}}, false, true)
  • 说明:第一个{}代表查询条件。$rename代表重命名字段。倒数第二个false表示如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入;倒数第一个true表示默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
  1. 删除字段

//删除test的content字段
db.test.update({
    
    },{
    
    $unset:{
    
    content:""}},false,true)
  • 说明:第一个{}代表查询条件。$unset去除字段。倒数第二个false表示如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入;倒数第一个true表示默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。

四、联合聚合查询

db.BASE_PATIENT.aggregate([
    {
    
    
      $match: {
    
    SOURCE_TYPE:"MIMIC4"}  
    },
    {
    
    
        $lookup: {
    
    
               from: "ICU_CHART_EVENT",
               localField: "SUBJECT_SN",
               foreignField: "SUBJECT_SN",
               as: "mimic4_docs"
             }
    }])

说明:其中 m a t c h 表 示 匹 配 对 象 , 相 当 于 q u e r y , match表示匹配对象,相当于query, match,queryloopup是聚合查询,from表示要对比的源表


五、 遍历ForEach

一般可用于mongo类型转换,mongo赋值等等。

db.getCollection("ICU_SEPSIS").find({
    
    }).forEach(function(item){
    
    
	item.SEPSIS_RR = Array(item.SEPSIS_RR);
	item.SEPSIS_TEMPERAURE = Array(item.SEPSIS_TEMPERAURE);
    //将字符串转换为数组
	item.SEPSIS_SPO = Array(item.SEPSIS_SPO);
	item.SEPSIS_DIA = Array(item.SEPSIS_DIA);
	item.SEPSIS_HR = Array(item.SEPSIS_HR);
	item.SEPSIS_SYS = Array(item.SEPSIS_SYS);
    //将字符串转换为int
	item.SEPSIS_AGE = NumberInt(item.SEPSIS_AGE);
	item.SEPSIS_LOC = NumberInt(item.SEPSIS_LOC);
    //将字符串转换为date
    item.DEATH_TIME = new ISODate(item.DEATH_TIME);
    //为字段赋值
    item.SOURCE_TYPE = "TEST";
	db.ICU_SEPSIS.save(item)
})

六、$type 操作符

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

类型 数字 备注
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已废弃。
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127

如果想获取 “col” 集合中 title 为 String 的数据,你可以使用以下命令:

db.col.find({
    
    "title" : {
    
    $type : 2}})
//等同于
db.col.find({
    
    "title" : {
    
    $type : 'string'}})

七、语句块操作

1、简单Hello World

print("Hello World!");
  • 说明:这种写法调用了print函数,和直接写入"Hello World!"的效果是一样的;

2、将一个对象转换成json

tojson(new Object());
tojson(new Object('a'));

3、循环添加数据

for (var i = 0; i < 30; i++) {
    
    
... db.users.save({
    
    name: "u_" + i, age: 22 + i, ***: i % 2});
... };

这样就循环添加了30条数据,同样也可以省略括号的写法

for (var i = 0; i < 30; i++) db.users.save({
    
    name: "u_" + i, age: 22 + i, ***: i % 2});

也是可以的,当你用db.users.find()查询的时候,显示多条数据而无法一页显示的情况下,可以用it查看下一页的信息;

4、find 游标查询

var cursor = db.users.find();
 while (cursor.hasNext()) {
    
     
  printjson(cursor.next()); 
}

这样就查询所有的users信息,同样可以这样写

var cursor = db.users.find();
while (cursor.hasNext()) { printjson(cursor.next); }

同样可以省略{}号

5、forEach迭代循环

db.users.find().forEach(printjson);

forEach中必须传递一个函数来处理每条迭代的数据信息

6、将find游标当数组处理

var cursor = db.users.find();
//取得下标索引为4的那条数据
cursor[4];

既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者cursor.count();

那样我们也可以用循环显示数据

for (var i = 0, len = c.length(); i < len; i++) printjson(c[i]);

7、将find游标转换成数组

var arr = db.users.find().toArray();
printjson(arr[2]);

用toArray方法将其转换为数组

8、定制我们自己的查询结果

只显示age <= 28的并且只显示age这列数据

db.users.find({
    
    age: {
    
    $lte: 28}}, {
    
    age: 1}).forEach(printjson);
db.users.find({
    
    age: {
    
    $lte: 28}}, {
    
    age: true}).forEach(printjson);

排除age的列

db.users.find({
    
    age: {
    
    $lte: 28}}, {
    
    age: false}).forEach(printjson);

9、forEach传递函数显示信息

db.things.find({
    
    x:4}).forEach(function(x) {
    
    print(tojson(x));});

猜你喜欢

转载自blog.csdn.net/weixin_45015214/article/details/119184168