之前在“这个场景更适合使用NoSQL”文章中通过和SQL的对比 介绍了NOSQL数据存储结构的特点,一位朋友看后希望再介绍下NOSQL查询方面的特点 这里以NOSQL中比较典型的mongodb数据库为例,先从用法上看下mongodb的操作方式,以后会更深入的介绍mongodb查询方面的细节 下面从3个方面看下mongodb的查询方式 (1)简单查询 类似于sql的 select * from table; (2)条件查询 类似于sql的 select * from table where name='jones'; (2)嵌套文档查询 类似于sql的join,但由于mongodb支持文档内部嵌套子文档,所以嵌套文档查询非常简单 准备数据 为了执行查询操作,需要先向数据库插入几条数据 (1)选择目标数据库 和sql数据库一样,需要先选择目标数据库 > use tutorial 注意 我的mongodb中并没有 tutorial 这个数据库,但可以直接切换过去 这里和sql数据库有点不同,实际上,mongodb中创建数据库并不是必需的操作,数据库与集合只有在第一次插入文档时才会被创建 (2)插入数据 现在创建第一个文档 > db.users.insert({username: "smith"}) 在键入这行代码后会感觉到一丝延迟,这是因为 tutorial 数据库和 users 集合都还没在磁盘上创建出来,延迟是因为要为它们的初始化数据文件分配空间 再向集合中添加一个用户 > db.users.save({username:"jones"}) 查询数据 (1)简单查询 现在 users 集合中已经有两个数据了,我们把所有数据都查询出来 > db.users.find() 结果信息
{
"_id" : ObjectId("5620c919f1"),
"username" : "smith"
}
{
"_id" : ObjectId("562cececf5"),
"username" : "jones"
}
find 方法中没有任何参数,就表示获取所有内容 (2)条件查询 可以向find方法中传递一个查询选择器,来返回符合条件的文档 例如取得username值为jones的文档 > db.users.find({username:"jones"}) 结果信息
{
"_id" : ObjectId("5628cececf5"),
"username" : "jones"
}
(3)嵌套文档查询 需要先构造数据,给smith添加一个喜好信息,喜好中包含电影信息
> db.users.update(
{username:"smith"},
{$set:{favorites: {movies:["spring","love"]} }}
)
现在看下集合中的文档结构 > db.users.find() 结果为: { "_id": ObjectId("56419f1"), "username": "smith", "favorites": { "movies": ["spring", "love"] } } { "_id": ObjectId("562ecf5"), "username": "jones" } 可以看到 favorites 是一个内嵌文档 现在想查询出谁喜欢"love"这部电影,应该如何查询? > db.users.find({"favorites.movies":"love"}) 这样就可以找出movies中包含"love"的文档 favorites 和 movies 之间的 点 告诉查询引擎应找一个名为favorites的键,它指向一个对象(该对象有一个名为movies的内部键),然后匹配它的值 ---- 通过上面的小例子,简单的了解了mongodb的数据库操作方式,给我的感觉是,这种方式对于程序员更加自然,易于接受,完全是按照程序的思路来操作,学习成本很低