02.MongoDB实战之第二篇

上一篇简答描述了一下的MongoDB的介绍,这一篇要进入主题了,来记录MangoDB的用法

1.Save增加数据

> db.foo.save({"name":"xiaoming"})
> db.foo.find()
{ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }

save用来增加一条数据
几点需要注意:
  • 不需要预先创建一个集合(也就是数据表),在第一次插入数据的时候会自动创建
  • 可以存储任何的数据结构,不需要类似于alter table语句来修改你的数据结构
  • 每次插入新数据时会在集合中创建一个ID,名字叫_id
可以多增加点数据

> db.foo.save({'name':'xiaoming',age:10,score:90})
> db.foo.save({'name':'xiaozhang',age:10,score:85})
> db.foo.save({'name':'xiaoli',age:11,score:99})
> db.foo.save({'name':'xiaomeng',age:11,score:100})
> db.foo.find()
{ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }
{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming", "age" : 10, "score" : 90 }
{ "_id" : ObjectId("51e510243c10628f02cfb77b"), "name" : "xiaozhang", "age" : 10, "score" : 85 }
{ "_id" : ObjectId("51e510353c10628f02cfb77c"), "name" : "xiaoli", "age" : 11, "score" : 99 }
{ "_id" : ObjectId("51e510403c10628f02cfb77d"), "name" : "xiaomeng", "age" : 11, "score" : 100 }
>

2.查询记录

2.1 普通无条件查询

在上文中已经看到这样一个操作,它是查询foo这个集合中的所有数据
> db.foo.find()

返回游标对象:
> var cursor=db.foo.find()
> while(cursor.hasNext())printjson(cursor.next())
{ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }
{
        "_id" : ObjectId("51e510133c10628f02cfb77a"),
        "name" : "xiaoming",
        "age" : 10,
        "score" : 90
}
{
        "_id" : ObjectId("51e510243c10628f02cfb77b"),
        "name" : "xiaozhang",
        "age" : 10,
        "score" : 85
}
{
        "_id" : ObjectId("51e510353c10628f02cfb77c"),
        "name" : "xiaoli",
        "age" : 11,
        "score" : 99
}
{
        "_id" : ObjectId("51e510403c10628f02cfb77d"),
        "name" : "xiaomeng",
        "age" : 11,
        "score" : 100
}
>
上面的例子显示了游标风格的迭代输出,hasNext()函数告诉我们是否还有数据,如果有则可以调用next()函数获取数据。

mongodb采用的是JavaScript shell,可以用到JS的特性,forEach就可以输出游标了。如下:
> var cursor=db.foo.find()
> while(cursor.hasNext())printjson(cursor.next())
{ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }
{
        "_id" : ObjectId("51e510133c10628f02cfb77a"),
        "name" : "xiaoming",
        "age" : 10,
        "score" : 90
}
{
        "_id" : ObjectId("51e510243c10628f02cfb77b"),
        "name" : "xiaozhang",
        "age" : 10,
        "score" : 85
}
{
        "_id" : ObjectId("51e510353c10628f02cfb77c"),
        "name" : "xiaoli",
        "age" : 11,
        "score" : 99
}
{
        "_id" : ObjectId("51e510403c10628f02cfb77d"),
        "name" : "xiaomeng",
        "age" : 11,
        "score" : 100
}
>
能达到和while同样的效果

在MongoDB shell里,我们可以把游标当作数据来用:
> var cursor=db.foo.find();
> printjson(cursor[1])
{
        "_id" : ObjectId("51e510133c10628f02cfb77a"),
        "name" : "xiaoming",
        "age" : 10,
        "score" : 90
}
>
不过要注意的是,使用上面这种方式,要注意占用内存的问题,特别是很大的游标对象,有可能会内存溢出,所以应该用迭代的方式来输出。下面是把游标转换成真实的数组类型:
> var arr=db.foo.find().toArray()
> arr[2]
{
        "_id" : ObjectId("51e510243c10628f02cfb77b"),
        "name" : "xiaozhang",
        "age" : 10,
        "score" : 85
}

请注意,这此特性只是在MongoDB Sehll里使用,而不是所有的其他应用程序驱动都支持。如果其他用户在集合里第一次或者最后一次调用netx(),你可能得到不游标里的数据。
所以要明确的锁定你要查询的游标。

2.2 条件查询


2.2.1 单条件查询

> db.foo.find({name:'xiaoming'})
{ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }
{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming", "age" : 10,
 "score" : 90 }
>
相当于SQL
SELECT * FROM foo WHERE name='xiaoming'

查询指定条件下返回数据结果(类似于返回表里某个字段)
> db.foo.find({name:'xiaoming'},{name:true})
{ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }
{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming" }
对应SQL语句
SELECT name FROM foo WHERE name='xiaoming'

2.2.2  多条件查询


未完,待续......

你可能感兴趣的:(02.MongoDB实战之第二篇)