不要让自己成为“老白兔”

PS:此篇文章是摘自36Kr上的。

笔记之前,请先思考:

  • 阿里为什么要做人才盘点?
  • 阿里人才盘点的价值是什么?
  • 阿里是怎么做人才盘点的?
  • 阿里是怎么选拨新人的?
  • 阿里人才盘点,重点盘什么?
  • 盘点的结果如何应用?

一、阿里为什么做盘点?

1)从人才角度:看人才本身是否增值。

2)从组织角度:树挪死人挪活,通过人才来激活组织发展。

第一次提到人才盘点,还是马老师提的,他说:

“我们公司越来越大了,对桌子、椅子这些资产每天盘一遍,为什么我们不对人盘一遍?人也是集团的资产,所以要每年盘一下,看一看人有没有增值?”

树挪死人挪活,要把人挪一挪。从集团的角度、发展人的角度,怎么把他们挪活?(回忆起来,应该是让很多人震惊的2012年、2013年那次变化,25个组织部的人瞬间被挪位,有组织部的、有M4资深总监这一层,组织部占了大多数。)

“盘”本身不是重点,是个过程,关键是盘点以后的很多做法更是可以分享的。

二、阿里人才盘点的价值是什么?

第一,对于像互联网或者是移动互联网行业,它的变化非常快,人才盘点是从战略到结果之间很重要的组织保障,人才盘点成了战略和结果之间一个很重要的连接。

人才盘点不仅仅只盘人,在整个作业里面,从战略层面先谈战略,再谈遇到的挑战是什么,然后是人的战略。人的战略,包括现有人的盘点,也是在为未来提高人才升级准备做的动作,它是一个组合拳。

湖畔大学戴珊演讲 | 又是一年点将时,阿里如何盘点人才?在阿里,基本在战略、预算和年终总结全部结束之后,在明确明年要做什么的时候,开始做人才盘点。过去一般是在开春,在阿里巴巴没有上市,没有财年之前,基本上是四月份,就是第二个季度开始做,现在一般在六月份开始做。人才盘点不是为过去盘点,人才盘点是为未来盘点。

第二,做人才盘点,我们规定HR不能讲,必须是业务的人来讲。我们认为,一个好领导者就是最好的HR,所以他要对他的人了解。

战略 X 组织能力 = 结果,就是实现的目标。

组织是很重要的一个环节,往往在上场打仗的时候,会忽略组织这个部分,在组织这个部分也有文化的部分。

所以,组织盘点,有几个我们要看的东西:

1)领导者对于战略、组织、文化是否是贯穿的?

2)组织是不是跟未来有连接的?

3)为了培养人才做了哪些事情,而不是只关注事情本身?

4)冉冉升起的明星是不是有足够大的舞台,是不是放到了合适的位置?

三、阿里是怎么做人才盘点的?

第一,把人当人看;

2009年第一次做人才盘点,马老师每年一定要花时间做人才盘点,全程参加,他在讲一个人的时候,是有感情的,是拟人化的,把那个人当人看。

也有很多管理者会这样讲:那个人今年34岁,研究生毕业,工作勤勤恳恳。这不是讲人,这是在描述一个东西。在这个过程中就会发现很多领导者在组织和组织完善上到底做得够不够。

第二,很多时候业务会变化,我们的业务已经往那个方向走了,可是人还站在这里。或者坚持做多年以后,会发现这一块业务每年都存在人才不足的问题,那么到底是业务的吸引力不够,还是我们对于人的吸引力不够,还是培养不够?发现问题,就从基础上去保障。

第三,前面讲到集团层面的25个人轮调,很多人被轮换到完全不熟悉的环境,淘宝的人调到了蚂蚁金服,蚂蚁金服的人调到了淘宝。这个过程,我们非常慎重认真地讨论每个人,每个人都要发表观点,对于他未来到底怎么看?我们看到的是:淘宝应该是数据驱动,我们的运营要升级,过去很感性,但需要加入理性。

选人的时候,从技术背景里面看哪个是未来愿意培养的,哪个是有担当的,哪个是热爱公司愿意突破的?又会回到心力、脑力、体力(湖畔大学彭蕾演讲:做企业是心力、脑力和体力的考验),以及自信、乐观、聪明、皮实(原来阿里人是这样选出来的 | 湖畔大学彭蕾剖析人才观),这些都要看,然后选一个合适的人。

湖畔大学戴珊演讲 | 又是一年点将时,阿里如何盘点人才?

做人才盘点的时候,马老师身上有几点让我很触动:

第一,马老师永远会发现那个人身上最亮的亮点,然后用他,给他平台和土壤,有时CEO真的需要勇气和发现,CEO要是一个好的伯乐。阿里永远有一个不变就是“变化”;

第二,因为是马老师和彭蕾来跟你讲,所以你也没有任何狡辩和争取的机会,再说狡辩也没有用;

第三,基于对公司的相信,觉得所有的变化都是为了培养自己,所以就没有什么好纠结的。

阿里怎么做人才盘点,有什么经验?

▷视人为人:看人性,看人的本质,带有温度的;

▷问题导向:谨慎去判断,是人的能力问题,还是业务发展的问题?

▷自上而下:从马云到彭蕾亲自抓,抓人的亮点,给平台和土壤。

四、阿里是怎么选拔新人的?

阿里选拔新人有很多种方式:

第一,多观察;

因为开不同的业务会议,会发现很多苗子,所以我很喜欢参加业务的会议,除了听业务,还有观察人;

第二,晋升面试。

哪些是全票肯定的,哪些是冉冉之星,HR散在各个地方,都会看得到,所以也会有一部分的数据收集;

从结果来看,当时推出人才盘点的时候,在整个集团有很多的质疑,比如管理者,到底权威是什么?会不会突然一堆人晋升?评审官会不会不公平?会不会有很多不该晋升的人被晋升了?

阿里人才盘点结果被质疑,怎么办?

第一,用数据说话;

有时候数据比人靠谱(从数据来看,第一年的数据比往年的晋升比例还低,更严格了,也因此沉淀了很多人的数据,比如说选什么样的人,面试官觉得什么样的人合适);

第二,做开放平台。

有条件地公布(因为它是一个公开的平台,很多新的苗子会从自己的业务里面被整个全淘宝看到)。

五、德州扑克选人才

湖畔大学戴珊演讲 | 又是一年点将时,阿里如何盘点人才?谈到我们怎么培养接班人,我们曾经要选一个叫“笑傲江湖班”,当时人很多。因为我们的业务都有未知性,所以我们就制定了几个特质,只有那种敢拼敢赌、有智慧的人才是我们未来想要的人,过于保守的人不是我们未来想要的人。

怎么样去更全面地看这帮人?除了过去评估方式之外,我们想到一个正式确立名单的方法,比如我们有30个人的名单,最后只选20个人,怎么把30个变成20个?打德州扑克。HR的人就会混在里面,老陆(陆兆禧)、我也混在里面,但我没有上桌,作为观察员到处晃。

这个游戏设计的背后,我们想看什么?

第一,个性是什么;

第二,为了赢,还能追加多少身家,这也是一种勇气和胆量的判断。

德州扑克不是只靠运气,它是靠智慧的,对台面的计算,既有感性也有理性的部分。为什么选德州没有选麻将?也是这个原因,而且它的输赢会很大,可能就在一把牌之间,输赢就分出来了。

大概从6点多开始,一直到12点多结束,我们弄完之后就进行第二天复盘,包括开始回看录像,对每个人的特质和原来的样子进行比对,你会发现90%是吻合的,但是更进一步让我们核心团队,即老陆、我、逍遥子(张勇)看清整个团队的状况,然后选出20个人进了“笑傲江湖班”,我们开始对他进行Mini-MBA的培训。

未来在做人才盘点的时候,我们都很清楚什么样的业务适合什么样的人。因为赌性太大也有风险,我们应该配什么样的人、什么样的机制、什么样的HR给他,都有很好的探讨。

从那场比赛里面,有三种人是被关注到的,风格各不一样。

湖畔大学戴珊演讲 | 又是一年点将时,阿里如何盘点人才?这三种人的个性都有不足,所以我们给他们配了不同的人。关于这场“笑傲江湖”,对于人性的判断还是挺有价值的。

六、阿里的人才盘点,重点盘什么人?

在阿里,我们会有四种“比喻”:

▷明星;(指有才又有德的员工,阿里的态度是对明星大胆用。)

▷野狗;(指有才无德的员工,对野狗限制用。)

▷黄牛;(指能力差一点但任劳任怨的员工,对老黄牛放心用。)

▷小白兔。(指有德无才的员工,对小白兔不使用。)

每年人才盘点,特别关注在公司很多年,又没有潜力,很多年不被晋升的人,即“老白兔”。当公司很小的时候,对公司伤害最大的永远是野狗,当公司大了,机制又完整了以后,对公司伤害最大的不是野狗,“老白兔”的影响是很大的。

湖畔大学戴珊演讲 | 又是一年点将时,阿里如何盘点人才?我们怎么定义“老白兔”?就是看起来兢兢业业,其实没什么产出,偶尔还会说点风凉话的。

因为组织在快速发展,这部分人在公司越来越多,会影响很多新人对这家公司的信任,甚至因为他们占了这个坑,本来可以创造更多价值的,因为他们在,所以很多机会就没有看到。

对于我们来讲,怎么发现组织里的“老白兔”,也是很重要的工作。

所以每次的人才盘点之后,我们都会有列表,里面有业绩差的,也有“老白兔”,我们HR体系就会跟踪这些人到底怎么样,绩效变好了没,换岗了没,我们也会充分讨论哪些人应该是被辞退的,哪些是应该被换岗的,哪些人应该是降级的,都会被讨论。这样的话才能确保整个组织不断地往前走。

我觉得,人才盘点是盘组织、盘文化、盘战略和落地之间的链接。既要有情、有义,也要有理。

七、盘点的结果如何应用?

公司在发展的过程中,要有一定的考核机制,而且要有非常量化的要求,但在量化的要求下,可以做得人性一点,这是我的观点。

在很多外企,很多时候做了正确的决定,可是过程太冷血,于是结果就不那么好。对于我来讲,我能理解跟着公司做了很多年,特别是在过去还曾经有过辉煌战功的人,没有功劳也有苦劳。

但是,当有一天发现他不合适的时候,怎么办?

湖畔大学戴珊演讲 | 又是一年点将时,阿里如何盘点人才?我是这么看的,你因为不敢跟他谈留着,双方都痛苦。他不痛苦吗?新人不断进来,他的地盘越来越小,职责越来越小,层级在变化,薪水也没有涨,别人还这么看他,不痛苦吗?

你为他好,你就应该作出一个决定,领导者一定要站在员工的角度,到底什么决定对他是最好的?不一定留在这里是最好的,不是说离开阿里就没有好的工作。作为领导者,当有一天他们离开你的时候,他会活得更好,这才是我们要的,而不是一直留在身边。

请人走的方式有很多,但没有某一种适合所有人的方式,因为还是要基于你对于个体的判断。有的人我是立马请他走的,一刻都不会挽留。

你的谈话是以人为本的谈话,还是以事情为本的谈话,结果是完全不一样的。

廣告

处理异步de发展史

1.处理异步的发展史

a.远古时代

我们在编写express后台,经常要有许多异步IO的处理。在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是 error 的函数。我们来模拟一个Mongo数据库的操作,感受一下。

mongoDb.open(function(err, db){
	if(!err){
		db.collection("users", function(err, collection){
			if(!err){
				let person = {name: "yika", age: 20};
				collection.insert(person, function(err, result){
					if(!err){
						console.log(result);
					}
				});
			}
		})
	}
});

这个也就是被我们所诟病的 callback hell ,一堆横向金字塔,如果将回调拆分成函数,则会变得非常支离破碎。为了防止到恶心到大家,我甚至没有写关于错误的处理,正常来说,每一个异步的操作都需要都它的 error 进行相应的显示或处理的。

b.Promise时代

后来进入了好一点的时代就是Promise,我们也可以称作链式操作。关于Promise,我也是之前有专门写过一系列的博文,有兴趣可以回头翻一下。这里来看看,将以上改写之后的状况。

let co = require("co");
co(function *(){
	let db, collection, result; 
	let person = {name: "yika"};
	try{
		db = yield mongoDb.open();
		collection = yield db.collection("users");
		result = yield collection.insert(person);
	}catch(e){
		console.error(e.message);
	}
	console.log(result);
});

我们可以看到,我们将金字塔已经平铺成一条线状结构了。相比之前恶心难以维护的chunk函数,变成了promise函数,并且错误的处理也变得十分优雅。但是我们仍然不可忽视某些问题,例如我们必须忍受各个逻辑被一个又一个的 then() 包裹起来,每一个函数都有其独立的作用域,如果为了共享某个数据就必须挂在最外层,最重要的还是,它与我们熟悉的同步编程仍然有差别。

c.Generator时代

TJ大神,借着ES6的Generator迭代器,最早实现了异步编程同步化的功能,也就是最为我们所熟知的 co 库。我们通过 co(function *(){}) 可以使函数内部通过迭代器来控制。而 co 在这里则是充当了启动器的角色。关于Generator和co我在之前的博文也同样说过。

async function insertData(person){
	let db, collection, result; 
	try{
		db = await mongoDb.open();
		collection = await db.collection("users");
		result = await collection.insert(person);
	}catch(e){
		console.error(e.message);
	}
	console.log(result);
} 
insertData({name: "yika"});

我们已经非常接近同步编程了,在co包裹的函数内部,只有一个异步执行完毕,才会继续执行下面的代码。并且错误的处理也是通过 try and catch 进行实现的。不过我们不得不承认的是,迭代器终究不是为异步而存在的。里面的 yield* 的语义也并不代表的就是异步函数标志。并且迭代器是需要co去驱动的,它和我们想象中的函数多少有一点点不同。

d.async/await时代

我们关注到ES7的async/await,才发现这才是我们想要的!我们将上面的代码小小改写一下。


// webpack.config.js
// 省略上面的文件输入输出的配置,直接看模块加载器的配置
module: {
	loaders: [
		{
			test: /\.js$/,
			exclude: /(node_modules|bower_components)/,
			loader: "babel",
			query: {
			  presets: ['es2015', 'stage-3']
			}
		},
	]
}

我们可以看到 inserData 是一个真正的函数,是我们可以直接去调用而无需启动器驱动的。当然内部我们也可以感受到处理 yield 变成了 await 以外,并没有很大区别。async/await,更符合我们异步编程的语义。

MongoDB 常用命令

mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。

 

安装及使用:

首先在Ubuntu上安装MongoDB。

下载MongoDB, 现在最新的生产版本1.7.0

  1. 解压文件.

$ tar -xvf mongodb-linux-i686-1.4.3.tgz

  1. 为MongoDB创建数据目录,默认情况下它将数据存储在/data/db

$ sudo mkdir -p /data/db/

$ sudo chown `id -u` /data/db

  1. 启动MongoDB服务.

$ cd mongodb-linux-i686-1.4.3/bin

$ ./mongod

  1. 打开另一个终端,并确保你在MongoDB的bin目录,输入如下命令.

$ ./mongo

一些概念

一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50GB以上数据时,Mongo数据库访问速度是MySQL10 倍以上。

BSON

BSON是Binary JSON 的简称,是一个JSON文档对象的二进制编码格式。BSON同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSON有Date类型和BinDate类型。

BSON被比作二进制的交换格式,如同Protocol Buffers,但BSON比它更“schema-less”,非常好的灵活性但空间占用稍微大一点。

BSON有以下三个特点:

1.  轻量级

2.  跨平台

3.  效率高

命名空间

MongoDB存储BSON对象到collections,这一系列的数据库名和collection名被称为一个命名空间。如同:java.util.List;用来管理数据库中的数据。

索引

mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,建立索引就意味着增加空间开销。默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的ID比较合适,比如商品的ID。

 

shell操作数据库:

 

  1.   超级用户相关:
  2. #进入数据库admin

use admin

  1. #增加或修改用户密码

db.addUser(‘name’,’pwd’)

  1. #查看用户列表

db.system.users.find()

  1. #用户认证

db.auth(‘name’,’pwd’)

  1. #删除用户

db.removeUser(‘name’)

  1.     #查看所有用户

show users

  1. #查看所有数据库

show dbs

  1.   #查看所有的collection

show collections

  1.   #查看各collection的状态

db.printCollectionStats()

  1. #查看主从复制状态

db.printReplicationInfo()

  1. #修复数据库

db.repairDatabase()

  1. #设置记录profiling,0=off 1=slow 2=all

db.setProfilingLevel(1)

  1. #查看profiling

show profile

  1.   #拷贝数据库

db.copyDatabase(‘mail_addr’,’mail_addr_tmp’)

  1. #删除collection

db.mail_addr.drop()

  1. #删除当前的数据库

db.dropDatabase()

 

  1. 2. 增删改
  2. #存储嵌套的对象

db.foo.save({‘name’:’ysz’,’address’:{‘city’:’beijing’,’post’:100096},’phone’:[138,139]})

 

  1. #存储数组对象

db.user_addr.save({‘Uid’:’yushunzhi@sohu.com’,’Al’:[‘test-1@sohu.com’,’test-2@sohu.com’]})

 

  1. #根据query条件修改,如果不存在则插入,允许修改多条记录

db.foo.update({‘yy’:5},{‘$set’:{‘xx’:2}},upsert=true,multi=true)

  1. #删除yy=5的记录

db.foo.remove({‘yy’:5})

  1. #删除所有的记录

db.foo.remove()

 

  1. 索引
  2. #增加索引:1(ascending),-1(descending)
  3. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
  4. #索引子对象
  5. db.user_addr.ensureIndex({‘Al.Em’: 1})
  6. #查看索引信息
  7. db.foo.getIndexes()
  8. db.foo.getIndexKeys()
  9. #根据索引名删除索引
  10. db.user_addr.dropIndex(‘Al.Em_1’)

 

  1. 查询
  2. #查找所有
  3. db.foo.find()
  4. #查找一条记录
  5. db.foo.findOne()
  6. #根据条件检索10条记录
  7. db.foo.find({‘msg’:’Hello 1′}).limit(10)
  8. #sort排序
  9. db.deliver_status.find({‘From’:’ixigua@sina.com’}).sort({‘Dt’,-1})
  10. db.deliver_status.find().sort({‘Ct’:-1}).limit(1)
  11. #count操作
  12. db.user_addr.count()
  13. #distinct操作,查询指定列,去重复
  14. db.foo.distinct(‘msg’)
  15. #”>=”操作
  16. db.foo.find({“timestamp": {“$gte" : 2}})
  17. #子对象的查找
  18. db.foo.find({‘address.city’:’beijing’})
  19. 管理
  20. #查看collection数据的大小
  21. db.deliver_status.dataSize()
  22. #查看colleciont状态
  23. db.deliver_status.stats()
  24. #查询所有索引的大小
  25. db.deliver_status.totalIndexSize()

 

  1. advanced queries:高级查询

条件操作符
$gt : >
$lt : <
$gte: >=
$lte: <=
$ne : !=、<>
$in : in
$nin: not in
$all: all
$not: 反匹配(1.3.3及以上版本)

查询 name <> “bruce" and age >= 18 的数据
db.users.find({name: {$ne: “bruce"}, age: {$gte: 18}});

查询 creation_date > ‘2010-01-01’ and creation_date <= ‘2010-12-31’ 的数据
db.users.find({creation_date:{$gt:new Date(2010,0,1), $lte:new Date(2010,11,31)});

查询 age in (20,22,24,26) 的数据
db.users.find({age: {$in: [20,22,24,26]}});

查询 age取模10等于0 的数据
db.users.find(‘this.age % 10 == 0’);
或者
db.users.find({age : {$mod : [10, 0]}});

匹配所有
db.users.find({favorite_number : {$all : [6, 8]}});
可以查询出{name: ‘David’, age: 26, favorite_number: [ 6, 8, 9 ] }
可以不查询出{name: ‘David’, age: 26, favorite_number: [ 6, 7, 9 ] }

查询不匹配name=B*带头的记录
db.users.find({name: {$not: /^B.*/}});
查询 age取模10不等于0 的数据
db.users.find({age : {$not: {$mod : [10, 0]}}});

#返回部分字段
选择返回age和_id字段(_id字段总是会被返回)
db.users.find({}, {age:1});
db.users.find({}, {age:3});
db.users.find({}, {age:true});
db.users.find({ name : “bruce" }, {age:1});
0为false, 非0为true

选择返回age、address和_id字段
db.users.find({ name : “bruce" }, {age:1, address:1});

排除返回age、address和_id字段
db.users.find({}, {age:0, address:false});
db.users.find({ name : “bruce" }, {age:0, address:false});

数组元素个数判断
对于{name: ‘David’, age: 26, favorite_number: [ 6, 7, 9 ] }记录
匹配db.users.find({favorite_number: {$size: 3}});
不匹配db.users.find({favorite_number: {$size: 2}});

$exists判断字段是否存在
查询所有存在name字段的记录
db.users.find({name: {$exists: true}});
查询所有不存在phone字段的记录
db.users.find({phone: {$exists: false}});

$type判断字段类型
查询所有name字段是字符类型的
db.users.find({name: {$type: 2}});
查询所有age字段是整型的
db.users.find({age: {$type: 16}});

对于字符字段,可以使用正则表达式
查询以字母b或者B带头的所有记录
db.users.find({name: /^b.*/i});

$elemMatch(1.3.1及以上版本)
为数组的字段中匹配其中某个元素

Javascript查询和$where查询
查询 age > 18 的记录,以下查询都一样
db.users.find({age: {$gt: 18}});
db.users.find({$where: “this.age > 18″});
db.users.find(“this.age > 18″);
f = function() {return this.age > 18} db.users.find(f);

排序sort()
以年龄升序asc
db.users.find().sort({age: 1});
以年龄降序desc
db.users.find().sort({age: -1});

限制返回记录数量limit()
返回5条记录
db.users.find().limit(5);
返回3条记录并打印信息
db.users.find().limit(3).forEach(function(user) {print(‘my age is ‘ + user.age)});
结果
my age is 18
my age is 19
my age is 20

限制返回记录的开始点skip()
从第3条记录开始,返回5条记录(limit 3, 5)
db.users.find().skip(3).limit(5);

查询记录条数count()
db.users.find().count();
db.users.find({age:18}).count();
以下返回的不是5,而是user表中所有的记录数量
db.users.find().skip(10).limit(5).count();
如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
db.users.find().skip(10).limit(5).count(true);

分组group()
假设test表只有以下一条数据
{ domain: “www.mongodb.org"
, invoked_at: {d:"2009-11-03″, t:"17:14:05″}
, response_time: 0.05
, http_action: “GET /display/DOCS/Aggregation"
}
使用group统计test表11月份的数据count:count(*)、total_time:sum(response_time)、avg_time:total_time/count;
db.test.group(
{ cond: {“invoked_at.d": {$gt: “2009-11″, $lt: “2009-12″}}
, key: {http_action: true}
, initial: {count: 0, total_time:0}
, reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time }
, finalize: function(out){ out.avg_time = out.total_time / out.count }
} );

[
{
“http_action" : “GET /display/DOCS/Aggregation",
“count" : 1,
“total_time" : 0.05,
“avg_time" : 0.05
}
]

 

Java 应用示例

要使用Java操作MongoDB的话,要到官方网站下载一个驱动包,把包导入后,可以尝试来操作了(记得一定要开着服务器)

首先介绍一下比较常用的几个类

Mongo:连接服务器,执行一些数据库操作的选项,如新建立一个数据库等

DB:对应一个数据库,可以用来建立集合等操作

DBCollection:对应一个集合(类似表),可能是我们用得最多的,可以添加删除记录等

DBObjec:接口和BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,因为是key-value的数据结构,所以用起来其实和HashMap是基本一致的

DBCursor:用来遍历取得的数据,实现了Iterable和Iterator

接下来实际的操作一下,代码如下:

import java.net.UnknownHostException;

import java.util.List;

import java.util.Set;

import com.mongodb.BasicDBObject;

import com.mongodb.DB;

import com.mongodb.DBCollection;

import com.mongodb.DBCursor;

import com.mongodb.DBObject;

import com.mongodb.Mongo;

import com.mongodb.MongoException;

public class MongoDbTest {

public static void main(String[] args) throws UnknownHostException, MongoException {

//Mongo m = new Mongo();

//Mongo m = new Mongo(“localhost");

//获得数据库服务

Mongo m = new Mongo(“localhost", 27017);

//得到数据库mytest

DB db = m.getDB(“mytest");

//得到mytest数据库下所有表名

Set<String> colls = db.getCollectionNames();

for (String s : colls) {

System.out.println(s);

}

//得到testCollection表

DBCollection coll = db.getCollection(“testCollection");

//new 一个BasicDBObject对象doc

BasicDBObject doc = new BasicDBObject();

//赋值

doc.put(“name", “MongoDB");

doc.put(“type", “database");

doc.put(“count", 1);

//又new 一个BasicDBObject对象info

BasicDBObject info = new BasicDBObject();

info.put(“x", 203);

info.put(“y", 102);

//把info放入doc

doc.put(“info", info);

//向testCollection表中插入一条数据

coll.insert(doc);

//查询一条数据

DBObject myDoc = coll.findOne();

System.out.println(myDoc);

 

//循环插入100条数据到testCollection

for (int i=0; i < 100; i++) {

coll.insert(new BasicDBObject().append(“i", i));

}

 

 

//Counting Documents in A Collection

System.out.println(coll.getCount());

 

//Using a Cursor to Get All the Documents

DBCursor cur = coll.find();

while(cur.hasNext()) {}

MongoDB NodeJS

前提:自己的网站涉及到文案内容的展示、更新,想为网站内容做相应持久层服务

NodeJS如果想使用mongodb作为持久层服务的话, 我们可以直接使用npm install mongodb,再或者使用mongoskin,mongoose!最终我选择mongo官网推荐的Mongodb

1.npm install mongodb(第一步就是安装我们的mongo module)

2.接下来我们要知道如何去连接我们的数据库

var MongoClient = require(‘mongodb’).MongoClient;

var url = ‘mongodb://localhost:27017/test’;

MongoClient.connect(url, function(err, db) {

        dbfunction(db, callback) {

db.collection(‘collectionName’).insertOne/find/updateOne/replaceOne/deleteMany/aggregate/……();

        }

});

3.我们要了解一些我们常用的dbfunction()

  • insertOne

var insertDocument = function(db, callback) {
db.collection(‘restaurants’).insertOne( {
“address" : {
“street" : “2 Avenue",
“zipcode" : “10075″,
“building" : “1480″,
“coord" : [ -73.9557413, 40.7720266 ]
},
“borough" : “Manhattan",
“cuisine" : “Italian",
“grades" : [
{
“date" : new Date(“2014-10-01T00:00:00Z"),
“grade" : “A",
“score" : 11
},
{
“date" : new Date(“2014-01-16T00:00:00Z"),
“grade" : “B",
“score" : 17
}
],
“name" : “Vella",
“restaurant_id" : “41704620″
},   function(err, result) {
assert.equal(err, null);
console.log(“Inserted a document into the restaurants collection.");
callback();
});
};