日期:2014-05-16  浏览次数:20308 次

MongoDB 实战笔记 一

MongoDB ?实战笔记

?

来建立一个 test 的集合并写入一些数据.? 建立两个对象 j 和 t ,? 并保存到集合中去.
在例子里 “>”? 来表示是 shell? 输入提示符
> j = { name : "mongo" };
{"name" : "mongo"}
> t = { x : 3 };
{ "x" : 3? }
> db.things.save(j);
> db.things.save(t);
> db.things.find();
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }


> for( var i = 1; i < 10; i++ ) db.things.save( { x:4, j:i } );
> db.things.find();

?

这里循环次数是 10,? 但是只显示到第 8 条,? 还有 2 条数据没有显示.? 如果想继
续查询下面的数据只需要使用”it”命令,

?

MongoDB 中,每一个集合都必须有一个叫做_id 的字段,字段类型默认是 ObjectId ,换句话
说,字段类型可以不是 ObjectId

?


虽然_id 的类型可以自由指定,但是在同一个集合中必须唯一,如果插入重复的值的话,系统
将会抛出异

?

> var cursor = db.things.find();
> while (cursor.hasNext()) printjson(cursor.next());

显示了游标风格的迭代输出. hasNext()? 函数告诉我们是否还有数据,? 如果有则
可以调用 next()? 函数.


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


在 MongoDB shell? 里,? 我们也可以把游标当作数组来用:
> var cursor = db.things.find();
> printjson(cursor[4]);

?

把游标转换成真实的数组类型:
> var arr = db.things.find().toArray();
> arr[5];
{ "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }

?


findOne()? 函数.? 这个函
数和 find()? 函数一样,? 不过它返回的是游标里第一条数据,? 或者返回 null,即空数据.
> printjson(db.things.findOne({name:"mongo"}));

?

?更新

db.things.update({name:"mongo"},{$set:{name:"mongo_new"}});

?

db.things.remove({name:"mongo_new"});

删除多条
for(var i=0;i<1000;i++) db.things.remove({j:i});

?

查询100条出来
db.things.find().limit(100);

?

<, <=, >, >=? 这个操作符就不用多解释了,最常用也是最简单的
db.collection.find({ "field" : { $gt: value } } );?? //? 大于:??? field > value
db.collection.find({ "field" : { $lt: value } } );?? //? 小于:???? field < value
db.collection.find({ "field" : { $gte: value } } );? //? 大于等于: field >= value
db.collection.find({ "field" : { $lte: value } } );? //? 小于等于: field <= value


如果要同时满足多个条件,可以这样做
db.collection.find({ "field" : { $gt: value1, $lt: value2 } } );??? // value1 < field < value

db.things.find({"xy":{$gt:"my0",$lt:"my7"}});??? <? <
db.things.find({"xy":{$gte:"my0",$lte:"my7"}});? <=? <=

db.c4.find("this.x>300000 && this.x<300002")

?

这个操作符跟 SQL 语法的 in 类似,但不同的是, in 只需满足( )内的某一个值即可,? 而$all 必
须满足[ ]内的所有值,例如:
db.users.find({age : {$all : [6, 8]}});

?

查询所有存在 age 字段的记录?
db.users.find({age: {$exists: true}});?
查询所有不存在 name 字段的记录?
db.users.find({name: {$exists: false}});

?


查询 age 取模 6 等于 1 的数据
>?? db.c1.find({age: {$mod : [ 6 , 1 ] } })
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }

?


查询 age 的值不等于 7 的数据
> db.c1.find( { age : { $ne : 7 } } );
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" : 30 }

?


查询 age 的值在 7,8 范围内的数据
> db.c1.find({age:{$in: [7,8]}});
{ "_id" : ObjectId("4fb4af85afa87d