MongDB 学习笔记(二)

108 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

基本操作

use database进入相应的数据库,如果没有则自动创建
db表示当前所处的数据库
show collections显示数据库中所有的数据表格
db..insert(bson);向集合中插入数据(id自动创建)
db..find();查找集合中的所有数据
db..insertOne(bson);插入一个数据对象
db..insertMany(bson);插入多个数据对象
db..find(bson);查询符合条件的文档数据
db..findOne(bson);查询符合条件集合的第一个数据
查询表达式
$eq=
$lt<
$lte<=
$gt>
$gte>=
$in包含
$nin不包含
$ne!=
/*
    查询num大于500
*/
db.teach.find(
    {
        name:{$gt:500}
    }
);
/*
	查询符合条件前2条记录
*/
db.teach.find({
    name:"hello"
    }).limit(2);
/*
	查询符合条件的11-20数据
	skip是跳过几条
*/
db.teach.find().skip(10).limit(10);

/**
	多条件查询
*/
db.ExpressTrajectoryLog.find({ 
  $and : [
  	{"createTime" : {$lte : ISODate("2018-06-30T18:00:00.000+0000")}},
  	{"createTime" : {$gte : ISODate("2018-06-11T18:00:00.000+0000")}},
  	{ $or :
   	    [ 
   	    	{ "trajectoryStatus" : "ETP01"} , 
   	    	{ "trajectoryStatus" : "ETP010"} , 
   	    	{ "trajectoryStatus" : { "$regex" : "^ESE"}}
   	    ]
   	  }
  ]
}).sort({
    "createTime": 1,
    "creatorId": 1
});

内嵌文档查询

内嵌文档查询主要是对数组的元素进行筛选
网站:https://blog.csdn.net/drifterj/article/details/7833883

修改

/*
    
    修改
        $set修改指定属性
        $unset删除指定的属性
    update 默认只能修改符合查询条件的其中之一的文档对象
    updateOne 只能修改一个
    updateMany 同时修改多个
*/
db.teach.update(
    {name:"hello"},
    {
    $set:{age:15}
    }
);

db.teach.updateOne(
    {name:"hello"},
    {
    $unset:{age:15}
    }
);

db.teach.updateMany(
    {name:"hello"},
    {
    $unset:{age:15}
    }
);

删除

--删除所有
db.teach.remove({});



文档之间的关系

一对多、多对一

db.user.insert(
[
    {
        name:"user1"
    },
    {
        name:"user2"
    } 
 ]   
);

db.order.insert(
 [
    {
        list:["or1","or2"],
        user:ObjectId("5b0e14177edb099ce17a3d97")
    },
    {
        list:["or3","or4"],
        user:ObjectId("5b0e14177edb099ce17a3d98")
    }
 ]
);

一对一

多对多

db.user.insert(
[
    {
        name:"user1"
    },
    {
        name:"user2"
    } 
 ]   
);

db.order.insert(
 [
    {
        list:["or1","or2"],
        user:[
        	ObjectId("5b0e14177edb099ce17a3d97"),
        	ObjectId("5b0e14177edb099ce17a3d98")
        	]
    },
    {
        list:["or3","or4"],
        user:[
        	ObjectId("5b0e14177edb099ce17a3d98"),
        	ObjectId("5b0e14177edb099ce17a3d97")
        	]
    }
 ]
);

sort和投影

sort根据指定的字段排序, 1 -升序  -1 -降序
db.teach.find({}).sort({age:1})

投影:显示自己想要的字段
db.teach.find({},{name:1})

aggregate

操作符对应的含义
$project数据投影,主要用于重命名、增加和删除字段
$match用于查询,相当于find,用法和find一样
$group将集合中的文档分组,可用于统计结果
$sort排序
$limit相当于mysql中的limit
$skip跳过几行
$unwind将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
需求:查询出每天每人送货数量

db.order.aggregate(
[
	{
	
		"$match":{
					"inDate":{"$lte":"2018-05-31","$gte":"2018-05-28"}
				}
	},

	{
		"$group":{
		  			"_id":{"userId":"$userId","inDate":"$inDate"},
		  			"count":{$sum:1}
		  		}
	},
	{
		"$sort":{
					"_id.userId":1
				}
	},
	{
		"$project":{
					"_id":0,
					"userId":"$_id.userId",
					"inDate":"$_id.inDate",
					"count":1
				}
	}
]
)

group

操作符对应的含义
key排序的字段
inital每个文档都分享这个初始化函数
reduce这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象。有多少个文档, $reduce就会调用多少次
condition过滤函数
finalize在整体执行完之后进行的方法
db.order.group(
{
	key:{"name":1,"inDate":1,"userId":1},
	initial:{"count":0},
	reduce:function(doc,out){out.count++;},
	condition:{"inDate":{"$gte":"2018-05-12","$lte":"2018-05-31"}},
	finalize:function(out){return out;}
}	
);

将结果集导出为excel