#创建索引
*索引说白了是一种数据结构,这种数据结构通常用在优化检索效率上,mongodb的索引通过B-tree实现。
*获取things的索引@
> db.things.getIndexes()
[ { "name" : "_id_", "ns" : "test.things", "key" : { "_id" : 1 } } ]
_id是所有document都有的索引。
*在i上创建一个索引,之后things会有两个索引@
> db.things.ensureIndex({i:1});
> db.things.getIndexes() [ { "name" : "_id_", "ns" : "test.things", "key" : { "_id" : 1 } }, { "_id" : ObjectId("4ee86f3d9027000000001ba5"), "ns" : "test.things", "key" : { "i" : 1 }, "name" : "i_1" } ]
说明一下:mongodb官网说@
写道
也就是说命令db.things.ensureIndex({i:1});里面的1会与i连接在一起生成索引的名字,1代表升序、-1代表降序,索引名字的长度不可超过128个字符,事实上聚集(collection)也有这样的限制。
ensureIndex()函数的说明是这样的:
db.things.ensureIndex(keypattern,options) - options should be an object with these possible fields: name, unique, dropDups
写道
background true/false false
dropDups true/false false
unique true/false false
sparse true/false false
v index version. 0 = pre-v2.0, 1 = smaller/faster (current) 1 in v2.0. Default is used except in unusual situations.
mongodb创建索引是可以使用.号,下面是官网给出的例子@
db.factories.insert( { name: "xyz", metro: { city: "New York", state: "NY" } } );
db.factories.ensureIndex( { "metro.city" : 1, "metro.state" : 1 } ); // these queries can use the above index: db.factories.find( { "metro.city" : "New York", "metro.state" : "NY" } ); db.factories.find( { "metro.city" : "New York" } ); db.factories.find().sort( { "metro.city" : 1, "metro.state" : 1 } ); db.factories.find().sort( { "metro.city" : 1 } )
*创建稀疏索引Sparse Indexes@
> db.people.ensureIndex({title : 1}, {sparse : true})
> db.people.save({name:"Jim"}) > db.people.save({name:"Sarah", title:"Princess"}) > db.people.find() { "_id" : ObjectId("4de6abd5da558a49fc5eef29"), "name" : "Jim" } { "_id" : ObjectId("4de6abdbda558a49fc5eef2a"), "name" : "Sarah", "title" : "Princess" } > db.people.find().sort({title:1}) // only 1 doc returned because sparse { "_id" : ObjectId("4de6abdbda558a49fc5eef2a"), "name" : "Sarah", "title" : "Princess" } > db.people.dropIndex({title : 1}) { "nIndexesWas" : 2, "ok" : 1 } > db.people.find().sort({title:1}) // no more index, returns all documents { "_id" : ObjectId("4de6abd5da558a49fc5eef29"), "name" : "Jim" } { "_id" : ObjectId("4de6abdbda558a49fc5eef2a"), "name" : "Sarah", "title" : "Princess" }
当使用Sparse Index的时候,某个没有title域的文档将不能被检索出。
*创建唯一索引@
db.things.ensureIndex({firstname: 1}, {unique: true});
db.things.save({lastname: "Smith"}); // Next operation will fail because of the unique index on firstname. db.things.save({lastname: "Jones"});
如果已有数据中有重复数据域,则在这个域上无法创建唯一索引,通过dropDups参数可以强制创建索引,使用该参数在创建索引的时候重复的数据会被无情的删除。
写道
db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})
*注意mongodb支持复合索引@
例如db.things.ensureIndex({i: 1,i2: 1});与db.things.ensureIndex({i: 1});db.things.ensureIndex({i2: 1});是完全不同的!
*删除索引@
db.collection.dropIndexes();
db.collection.dropIndex({i: 1})
*也可以通过命令删除@
// remove index with key pattern {y:1} from collection foo
db.runCommand({dropIndexes:'foo', index : {y:1}}) // remove all indexes: db.runCommand({dropIndexes:'foo', index : '*'})
#使用特权指令
*关闭数据库@
> use admin;
> db.runCommand("shutdown");
或者,如果不是admin可以@
> db._adminCommand("shutdown");
或者这样@
> db.shutdownServer();
#复制数据库
*复制数据库mydb到test@
> db.copyDatabase("mydb", "test", "localhost");
{ "ok" : 1 }
#关于MapReduce
官方例子1@
> m = function() { emit(this.user_id, 1); }
> r = function(k,vals) { return 1; } > res = db.events.mapReduce(m, r, { query : {type:'sale'} }); > // or in v1.8+: > // res = db.events.mapReduce(m, r, { query : {type:'sale'}, out : 'example1' }); > db[res.result].find().limit(2) { "_id" : 8321073716060 , "value" : 1 } { "_id" : 7921232311289 , "value" : 1 } > r = function(k,vals) { ... var sum=0; ... for(var i in vals) sum += vals[i]; ... return sum; ... }
官方例子2@
$ ./mongo
> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } ); > db.things.insert( { _id : 2, tags : ['cat'] } ); > db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } ); > db.things.insert( { _id : 4, tags : [] } ); > // map function > m = function(){ ... this.tags.forEach( ... function(z){ ... emit( z , { count : 1 } ); ... } ... ); ...}; > // reduce function > r = function( key , values ){ ... var total = 0; ... for ( var i=0; i<values.length; i++ ) ... total += values[i].count; ... return { count : total }; ...}; > res = db.things.mapReduce(m, r, { out : "myoutput" } ); > res { "result" : "myoutput", "timeMillis" : 12, "counts" : { "input" : 4, "emit" : 6, "output" : 3 }, "ok" : 1, } > db.myoutput.find() {"_id" : "cat" , "value" : {"count" : 3}} {"_id" : "dog" , "value" : {"count" : 2}} {"_id" : "mouse" , "value" : {"count" : 1}} > db.myoutput.drop()
关于MR网上有许多细致的分析,本人感觉MR与分治的思想相似。