获取MongoDB数据库请看这篇文章快速 体验MongoDB-windows版本 http://xiayuanfeng.iteye.com/blog/978729 连接数据库这部分让我们通过MongoDB shell来操作数据库. (我们也可以使用各种语言的MongoDB的驱动. shell是非常方便系统管理员操作的环境) 启动MongoDB Shell环境 # 'mongo' 是个可运行程序. 准确的路径地址,取决于你安装的目录。 $ bin/mongo 默认的是连接localhost上的test数据库 MongoDB shell version: <whatever> url: test connecting to: test type "help" for help > "connecting to:" 告诉我们当前连接的数据库名称. 如果要切换数据库,输入: > use mydb switched to db mydb 要得知更多的命令,请输入help.
向collection中插入数据让我们创建一个测试的collection并向它插入数据. 我们将要创建两个对象, j 和t, 并且把它们保存在名称为things的collection中。 在下面的例子中, '>' 是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 } > 需要注意的事项 :
让我们添加更多的documents。 > for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i}); > db.things.find(); { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } has more 要注意的是,并不是所有的documents都显示了,当自动迭代一个游标(cursor)时候, shell的限制数为20。除了我们已经添加的两个documents,实际我们看到的文档数为18个。
如果想要下一个结果集,输入it。结果如下
{ "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } has more > it { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
技术上来说,find()返回了一个cursor对象。但是在上个例子中,我们没有把cursor赋予一个变量,
因此shell自动迭代了这个cursor。给我们显示了一个最初的结果集并且可以输入it命令来查看后续的结果集。
但是我们可以直接操作cursor;下一部分我们详细讨论。
通过查询语句访问数据
在我们讨论查询语句之前,让我们讨论下一个怎样处理查询结果。也就是cursor对象。
我们会使用间的find()查询方法,这个方法会返回一个collection中所有的documents,
并且之后在讲解怎样创建一个具体的查询。
当使用mongo shell的时候,为了查看一个collection中所有的玄素,
我们需要直接使用find()操作返回的cursor对象。
让我们重复相同的查询,但是唯一不同的是使用cursor并且对它进行迭代了。
> var cursor = db.things.find();
> while (cursor.hasNext())
print json(cursor.next()); { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
上面的例子现实了基于cursor风格的迭代过程。hasNext()方法可以得知是否还可以返回
更多的documents,并且next()方法返回了下一个的document。我们还使用了内置的
pringjson()方法来展示JSON风格的document。
当我们在javascript shell环境下,我们可以使用javascript的语言,
所以可以调用forEach来循环cursor。重复这个例子,但是使用forEach()方法来替代while循环。
> db.things.find().forEach(printjson); { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
这个例子中forEach()方法,我们必须第一个函数,这个函数用来调用cursor中每个document。
在mongo shell中,你可以把cursor当做一个数组:
> var cursor = db.things.find();
> printjson(cursor[4]); { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
当你这么使用cursor的时候,要注意的是当访问数据的同时,所有的数据都被写入
到RAM中了。这对于大数据集来说是不合适的,可能内存溢出。cursor应该用来迭代。
还要说的就是你可以把cursor转为一个真正的数组:
> var arr = db.things.find().toArray();
> arr[5]; { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
要注意的是这种数组特性只适用于mongo shell环境,其他的驱动并不支持。
MongoDB cursor并不是一个快照(snapshots)-你的操作或者其他用户的操作在
第一次和最后一次调用你的cursor的next()方法,也许并不会返回结果。请使用锁来做一个快照式的查询。
返回特定的查询结果
现在我们知道怎样操作查询所返回的cursor对象了,接下来我们就关注下怎样返回
特定的查询结果。一般来说,先创建一个"query document",来和已有的documents进行匹配。
这部分举例要比解释更好。在下面的例子中,我们会给出SQL查询语句,并且举例
怎样通过mongo shell来获取和SQL相同的结果。
这些都是MongoDB查询的基础,也可以查看各个语言驱动的实现。
SELECT * FROM things WHERE name="mongo"
> db.things.find({name:"mongo"}).forEach(printjson);
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
SELECT * FROM things WHERE x=4
> db.things.find({x:4}).forEach(printjson); { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
这个查询表达式本身就是个document。一个查询document的格式{a:A,b:B,...}等同于SQL中的
"where a==A and b==B and ..."。更多的查询功能查看
Queries and Cursors
方法的第二字参数。
为了举例,让我们重复上一个例子find({x:4})并且加上了第二个参数来加以限制,只返回j字段。
SELECT j FROM things WHERE x=4
> db.things.find({x:4}, {j:true}).forEach(printjson);
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "j" : 19 } { "_id" : ObjectId(
|