db.collection.find({ "field" : { $gt: value } } ); // greater than : field > value
db.collection.find({ "field" : { $lt: value } } ); // less than : field < value
db.collection.find({ "field" : { $gte: value } } ); // greater than or equal to : field >= value
db.collection.find({ "field" : { $lte: value } } ); // less than or equal to : field <= value
如查询j大于3,于4:
db.things.find({j : {$lt: 3}});
db.things.find({j : {$gte: 4}});
也可以合q在一条语句内:
db.collection.find({ "field" : { $gt: value1, $lt: value2 } } ); // value1 < field < value
2) 不等?$ne
例子Q?/p>
db.things.find( { x : { $ne : 3 } } );
db.collection.find( { "field" : { $in : array } } );
例子Q?/p>
db.things.find({j:{$in: [2,4,6]}});
db.things.find({j:{$nin: [2,4,6]}});
db.things.find( "this.a % 10 == 1")
可用$mod代替Q?/p>
db.things.find( { a : { $mod : [ 10 , 1 ] } } )
{ a: [ 1, 2, 3 ] }
下面q个条g是可以匹配的Q?/p>
db.things.find( { a: { $all: [ 2, 3 ] } } );
但是下面q个条g׃行了Q?/p>
db.things.find( { a: { $all: [ 2, 3, 4 ] } } );
db.things.find( { a : { $size: 1 } } );
官网上说不能用来匚w一个范围内的元素,如果x$size<5之类的,他们创徏一个字D|保存元素的数量?/p>
You cannot use $size to find a range of sizes (for example: arrays with more than 1 element). If you need to query for a range, create an extra size field that you increment when you add elements.
7Q?exists
$exists用来判断一个元素是否存在:
如:
db.things.find( { a : { $exists : true } } ); // 如果存在元素a,p?/span>
db.things.find( { a : { $exists : false } } ); // 如果不存在元素aQ就q回
$type Z bson type来匹配一个元素的cdQ像是按照类型ID来匹配,不过我没扑ֈbsoncd和id对照表?/p>
db.things.find( { a : { $type : 2 } } ); // matches if a is a string
db.things.find( { a : { $type : 16 } } ); // matches if a is an int
db.customers.find( { name : /acme.*corp/i } ); // 后面的i的意思是区分大小?/pre>
db.things.find( { colors : "red" } );
> t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )
{ "_id" : ObjectId("4b5783300334000000000aa9"),
"x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]
}
$elemMatch : { a : 1, b : { $gt : 1 } } 所有的条g都要匚w上才行?/pre>注意Q上面的语句和下面是不一L?/p>
> t.find( { "x.a" : 1, "x.b" : { $gt : 1 } } )
$elemMatch是匹配{ "a" : 1, "b" : 3 }Q而后面一句是匚w{ "b" : 99 }, { "a" : 11 }
12) 查询嵌入对象的?br />
db.postings.find( { "author.name" : "joe" } );注意用法?span class="code-quote">author.nameQ用一个点p了。更详细的可以看q个链接Q?dot notation
举个例子Q?/p>
> db.blog.save({ title : "My First Post", author: {name : "Jane", id : 1}})如果我们要查?authors name 是Jane? 我们可以q样Q?/p>
> db.blog.findOne({"author.name" : "Jane"})如果不用点,那就需要用下面q句才能匚wQ?/p>
db.blog.findOne({"author" : {"name" : "Jane", "id" : 1}})下面q句Q?/p>
db.blog.findOne({"author" : {"name" : "Jane"}})是不能匹配的Q因为mongodb对于子对象,他是_匚w?/p>
13) 元操作符 $not 取反
如:
db.customers.find( { name : { $not : /acme.*corp/i } } );db.things.find( { a : { $not : { $mod : [ 10 , 1 ] } } } );mongodbq有很多函数可以用,如排序,l计{,请参考原文?br />
mongodb目前没有?or)操作W,只能用变通的办法代替Q可以参考下面的链接Q?br />
http://www.mongodb.org/display/DOCS/OR+operations+in+query+expressions
]]>
#coding=utf-8
from pymongo import Connection
conn = Connection("localhost")
db = conn.foo
test = {"id":1, "novle":"试一?/span>"}
db.foo.save(test)
cursor = db.foo.find()
for i in cursor:
print i
虽然报错Q不影响执行
out
{u'_id': ObjectId('4bc193c11724bc0cc4000000'), u'id': 1, u'novle': u'\ufffd\ufffd\ufffd\ufffd'}
OK 试成功
下次 是?怎么在DJANGO里面 使用mongodb?/p>
MongoDB把数据存储在文g中(默认路径为:/data/dbQ,为提高效率用内存映文件进行管理?/p>
安装Q?br />
Linux/OS X?
1 建立数据目录
mkdir -p /data/db
2 下蝲压羃?br />
curl -O http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz
3 解压~文?br />
tar xzf mongodb-linux-i386-latest.tgz
4 启动服务
bin/mongod run &
5 使用自带客户端连?br />
/bin/mongo
6 试
db.foo.save( { a : 1 } )
db.foo.findOne()
windows下:
1 建立数据目录c:\data\db
2 下蝲压羃包,解压文g
3 启动服务
bin\mongod.exe run
4 自带客户?br />
bin\mongon.exe
在LINUX和WINDOWSpȝ下的使用大同异Q不同的地方主要是默认的数据存储目录。LINUXcȝl下存放?data/db下,而WINDOWS
会存攑֜C:\data\db下。可以在启动时?-dbpath参数指定存储目录q启动。如Qbin\mongod.exe --dbpath d:\data\mongo
常用启动参数Q?br />
run 直接启动。例Q?/mongod run
--dbpath 指定特定存储目录启动Q若目录不存在则创徏。例Q?/mongod --dbpath /var/data/mongo
--port 指定端口启动。例Q?/mongod --port 12345
停止MONGO服务Q?br />
Ҏ1Q服务端停止Q可使用Ctrl+C
Ҏ2Q在客户端停止,可先q接客户?br />
./mongo
q用命?br />
db.shutdownerver()
然后退出客L
exit
使用JAVA语言操作MONGODB非常单,只要驱动文件加入到CLASSPATH中就可以使用?/p>
1 建立q接
要徏立MongoDB的连接,你只要指定要q接到的数据库就可以。这个数据库不一定存在,如果不存在,MongoDB会先Z建立q个
库。同Ӟ在连接时你也可以具体指定要连接到的网l地址和端口。下面的是连接本机数据库的一些例子:
import com.mongodb.Mongo;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
import com.mongodb.MongoAdmin;
Mongo db = new Mongo("mydb");
Mongo db = new Mongo("localhost", "mydb");
Mongo db = new Mongo("localhost", 27017, "mydb");
2 安全验证Q非必选)
MongoDB服务可以在安全模式运行,此时M客户端要q接数据库时需使用用户名和密码。在JAVA中可使用如下Ҏq接Q?/p>
boolean auth = db.authenticate(userName, password);
如果用户名密码验证通过Q返回gؓtrueQ否则ؓfalse
3 获取集合列表
每个数据库都存在零个或多个集合,需要时你可以获得他们的列表Q?/p>
Set<String> colls = db.getCollectionNames();
for(String s : colls){
System.out.println(s);
}
4 获得一个集?br /> 要获得某个特定集合,你可以指定集合的名字Qƈ使用getCollection()ҎQ?/p>
DBCollection coll = db.getCollection("testCollection");
当你获取了这个集合对象,你就可以Ҏ据进行增删查改之cȝ操作?/p>
5 插入文档
当你获得了一个集合对象,你就可以把文档插入到q个对象中。例如,存在一个JSON式的文档:
{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : {
x : 203,
y : 102
}
}
h意,q个文档包含一个内部文档。我们可以用BasicDBObjectcL创徏q个文档Qƈ且用insert()Ҏ方便地将它插入到?/p>
合中?/p>
BasicDBObject doc = new BasicDBObject();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);
BasicDBObject info = new BasicDBObject();
info.put("x", 203);
info.put("y", 102);
doc.put("info", info);
coll.insert(doc);
6 使用findOne()查找集合中第一个文?br /> 要查找我们上一步插入的那个文档Q可以简单地使用findOne()操作来获取集合中W一个文档。这个方法返回一个单一文档Q这是相对于使用DBCursor的find()操作的返回)Q这对于只有一个文档或我们刚插入第一个文档时很有用,因ؓ此时q不需要用光标?/p>
DBObject myDoc = coll.findOne();
System.out.println(myDoc);
q回cMQ?br />
{
"_id" : "ac907a1f5b9d5e4a233ed300" ,
"name" : "MongoDB" ,
"type" : 1 ,
"info" : {
"x" : 203 ,
"y" : 102} ,
"_ns" : "testCollection"
}
注意_id和_ns元素是由MongoDB自动加入你的文档。记住:MongoDB内部存储使用的元素名是以“_”做ؓ开始?/p>
7 加入多种文档
Z做更多有的查询试验Q让我们向集合中加入多种文档cdQ象Q?br />
{
"i" : value
}
可以通过循环来实?/p>
for(int i = 0; i < 100; i++){
coll.insert(new BasicDBObject().append("i", i));
}
注意我们可以在一个集合中插入不同cd的文档,q就是我们所说的“模式自由”Qschema-freeQ?/p>
8 l计文档数量
使用getCount()Ҏ
System.out.println(coll.getCount());
9 使用光标QcursorQ来获取全部文档
Z获取集合中的所有文档,我们可以使用find()Ҏ。这个方法返回一上DBCursor对象Q来允许我们符合查询条件的文档q代
出来?/p>
DBCursor cur = coll.find();
while(cur.hasNext()){
System.out.println(cur.next());
}
10 在查询中获取单一文档
我们可以创徏一个查询,q传递给find()Ҏ来获取集合中所有文档的一个子集。例如,我们惌查询域名?i"Qƈ且gؓ71的文档:
BasicDBObject query = new BasicDBObject();
query.put("i", 71);
cur = coll.find(query);
while(cur.hasNext()){
System.out.println(cur.next());
}
11 使用条g查询获取集合
例如Q我们想要查询所有i>50的文档:
BasicDBObject query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt", 50));
cur = coll.find(query);
while(cur.hasNext()){
System.out.println(cur.next());
}
当然Q我们也可以?0 < i <= 30的查?/p>
BasicDBObject query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));
cur = coll.find(query);
while(cur.hasNext()){
System.out.println(cur.next());
}
12 创徏索引
MongoDB支持索引Q而且很容易在集合上增加烦引。要创徏索引Q只需要指定要加烦引的属性,q且指定升序Q?Q或降序卛_Q?1Q?/p>
coll.createIndex(new BasicDBObject("i", 1));
13 获取索引列表
List<DBObject> list = coll.getIndexInfo();
for(DBObject o : list){
System.out.println(o);
}
14 MongoDB理函数
理函数在com.mongodb.MongoAdmincM定义?br />
例AQ获取数据库列表
MongoAdmin admin = new MongoAdmin();
for(String s : admin.getDatabaseNames()){
System.out.println(s);
}
例BQ获取数据库对象
Mongo m = admin.getDB("mydb");
例CQ删除数据库
admin.dropDatabase("mydb");
15 用DBObject存储JAVA对象
MongoDB for JAVA驱动中提供了用于向数据库中存储普通对象的接口DBObject
例如Q存在一个需要存储的对象cTweet
public class Tweet implements DBObject{
/*...*/
}
可以使用如下代码Q?/p>
Tweet myTweet = new Tweet();
myTweet.put("user", userId);
myTweet.put("message", message);
myTweet.put("date", new Date());
collection.insert(myTweet);
当一个文档从MongoDB中取出时Q它会自动把文档转换成DBObject接口cdQ要它实例化ؓ你的对象Q需使用
DBCollection.setObjectClass()?br />
collection.setObjectClass(Tweet);
Tweet myTweet = (Tweet)collection.findOne();
16 JAVA驱动的ƈ发?br /> JAVA的MongoDB驱动是线E安全的。如果你它用在WEB服务中,可以创徏它的一个单例,q在所有请求中使用它?/p>
然而,如果你需要在一个会话(例如HTTPhQ中保证事务一致性,也许你会希望在这个会话中寚w动用同一个端口。这仅仅?/p>
h量非常大的环境中Q例如你l常会读取刚写入的数据?br />
Zq一点,你需要用如下代码:
Mongo m;
m.restartStart();
// code.........
m.requestDone();
以上介绍了简单的mongoDB使用Q更多信息请查阅MongoDB API for Java?/p>
CODE:
> show dbs
CODE:
> db
Admin
惛_换到test数据库下?
CODE:
> use test
switched to db test
> db
Test
x看test下有哪些表或者叫collectionQ可以输?
CODE:
> show collections
system.indexes
user
想知道mongodb支持哪些命oQ可以直接输入help
CODE:
> help
HELP
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time >= 1ms
use <db name> set curent database to <db name>
db.help() help on DB methods
db.foo.help() help on collection methods
db.foo.find() list objects in collection foo
db.foo.find( { a : 1 } ) list objects in foo where a == 1
it result of the last line evaluated; use to further iterate
如果想知道当前数据库支持哪些ҎQ?
CODE:
> db.help();
DB methods:
db.addUser(username, password) d数据库授权用?br />
db.auth(username, password) 讉K认证
db.cloneDatabase(fromhost) 克隆数据?br />
db.commandHelp(name) returns the help for the command
db.copyDatabase(fromdb, todb, fromhost) 复制数据?br />
db.createCollection(name, { size : ..., capped : ..., max : ... } ) 创徏?br />
db.currentOp() displays the current operation in the db
db.dropDatabase() 删除当前数据?br />
db.eval_r(func, args) run code server-side
db.getCollection(cname) same as db['cname'] or db.cname
db.getCollectionNames() 获取当前数据库的表名
db.getLastError() - just returns the err msg string
db.getLastErrorObj() - return full status object
db.getMongo() get the server connection object
db.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair
db.getName()
db.getPrevError()
db.getProfilingLevel()
db.getReplicationInfo()
db.getSisterDB(name) get the db at the same server as this onew
db.killOp() kills the current operation in the db
db.printCollectionStats() 打印各表的状态信?br />
db.printReplicationInfo() 打印L据库的复制状态信?br />
db.printSlaveReplicationInfo() 打印从数据库的复制状态信?br />
db.printShardingStatus() 打印分片状态信?br />
db.removeUser(username) 删除数据库用?br />
db.repairDatabase() 修复数据?br />
db.resetError()
db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into { cmdObj : 1 }
db.setProfilingLevel(level) 0=off 1=slow 2=all
db.shutdownServer()
db.version() current version of the server
如果想知道当前数据库下的表或者表collection支持哪些ҎQ可以用一下命令如Q?
CODE:
> db.user.help(); user?br />
DBCollection help
db.foo.count() l计表的行数
db.foo.dataSize() l计表数据的大小
db.foo.distinct( key ) - eg. db.foo.distinct( 'x' ) 按照l定的条仉?br />
db.foo.drop() drop the collection 删除?br />
db.foo.dropIndex(name) 删除指定索引
db.foo.dropIndexes() 删除所有烦?br />
db.foo.ensureIndex(keypattern,options) - options should be an object with these possible fields: name, unique, dropDups 增加索引
db.foo.find( [query] , [fields]) -
first parameter is an optional query filter. second parameter is
optional set of fields to return. Ҏ条g查找数据
-----------------------
通过条g查询Q?db.foo.find( { x : 77 } , { name : 1 , x : 1 } )
-----------------------------
db.foo.find(...).count()
db.foo.find(...).limit(n) Ҏ条g查找数据q返回指定记录数
db.foo.find(...).skip(n)
db.foo.find(...).sort(...) 查找排序
db.foo.findOne([query]) Ҏ条g查询只查询一条数?br />
db.foo.getDB() get DB object associated with collection q回表所属的?br />
db.foo.getIndexes() 昄表的所有烦?br />
db.foo.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } ) Ҏ条g分组
db.foo.mapReduce( mapFunction , reduceFunction , <optional params> )
db.foo.remove(query) Ҏ条g删除数据
db.foo.renameCollection( newName ) renames the collection 重命名表
db.foo.save(obj) 保存数据
db.foo.stats() 查看表的状?br />
db.foo.storageSize() - includes free space allocated to this collection 查询分配到表I间大小
db.foo.totalIndexSize() - size in bytes of all the indexes 查询所有烦引的大小
db.foo.totalSize() - storage allocated for all data and indexes 查询表的d?br />
db.foo.update(query, object[, upsert_bool]) Ҏ条g更新数据
db.foo.validate() - SLOW 验证表的详细信息
db.foo.getShardVersion() - only for use with sharding
Mongodb的备份工具mongodumpCODE:
[falcon@www.fwphp.cn ~/mongodb/bin]$ ./mongodump --help
options:
--help produce help message
-h [ --host ] arg mongo host to connect to
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod data files in this path,
instead of connecting to a mongod instance
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
-o [ --out ] arg (=dump) output directory
[falcon@www.fwphp.cn ~/mongodb/bin]$ [color=Blue]./mongodump -d test -o test/[/color]
connected to: 127.0.0.1
DATABASE: test to test/test
test.user to test/test/user.bson
100000 objects
test.system.indexes to test/test/system.indexes.bson
1 objects
[falcon@www.fwphp.cn ~/mongodb/bin]$ ls
2 mongo mongodump mongofiles mongorestore mongosniff
dump mongod mongoexport mongoimport mongos test
MongoDB的数据恢复工具mongorestoreCODE:
> show collections
system.indexes
User
删除user?
CODE:
> db.user.drop();
True
> show collections
System.indexes
现在利用mongorestore表恢复刚才利用mongodump备䆾的数?
CODE:
[falcon@www.fwphp.cn ~/mongodb/bin]$ ./mongorestore --help
usage: ./mongorestore [options] [directory or filename to restore from]
options:
--help produce help message
-h [ --host ] arg mongo host to connect to
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod data files in this path,
instead of connecting to a mongod instance
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
[falcon@www.fwphp.cn ~/mongodb/bin]$ ./mongorestore -d test -c user test/test/user.bson
connected to: 127.0.0.1
test/test/user.bson
going into namespace [test.user]
100000 objects
User表中?0w条记录已l恢?
CODE:
> show collections
system.indexes
user
> db.user.find();
{ "_id" : ObjectId("4b9c8db08ead0e3347000000"), "uid" : 1, "username" : "Falcon.C-1" }
{ "_id" : ObjectId("4b9c8db08ead0e3347010000"), "uid" : 2, "username" : "Falcon.C-2" }
{ "_id" : ObjectId("4b9c8db08ead0e3347020000"), "uid" : 3, "username" : "Falcon.C-3" }
{ "_id" : ObjectId("4b9c8db08ead0e3347030000"), "uid" : 4, "username" : "Falcon.C-4" }
{ "_id" : ObjectId("4b9c8db08ead0e3347040000"), "uid" : 5, "username" : "Falcon.C-5" }
.................
has more