查询就是获取存储在数据库中的数据。
在 MongoDB 中,查询通常针对一个集合来操作。查询可以指定查询条件,只返回匹配的文档;还可以指定投影项,只返回指定的字段,减少返回数据到客户端的网络流量。
1、MongoDB 查询文档使用 find() 方法
find() 方法以非结构化的方式来显示所有文档。
MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection)
参数说明:
query :可选,使用查询操作符指定查询条件。
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式为:
db.col.find().pretty()。
示例:
db.col.find().pretty()
{
“_id” : ObjectId(“56063f17ade2f21f36b03133”),
“title” : “aaa”,
“description” : “MongoDB 是一个 Nosql 数据库”,
“by” : “bb”,
“url” : “http://www.runoob.com”,
“tags” : [
“mongodb”,
“database”,
“NoSQL”
],
“likes” : 100
}
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
下面就来举例说明多表数如何关联的。
在关系数据库 MySQL 中我们可能需要设计 3 个表如客户表 customers、订单表 orders、商品表 products,其中 customers 表中的主键为 cust_id,products 表中的主键为prod_id,orders 表中主键 order_id,外键 cust_id 和 prod_id 分别与客户和产品关联,这就是在关系数据库中经常干的事情,整个结构如下图所示:
查询某个客户所订购的所有商品名称的 SQL 语句则为以下格式:
select tl.name,t3.prod_name from customer tl
join orders t2 on tl.cust_id = t2.cust_id
join products t3 on t2.prod_id = t3.prod_id;
在前面已经说过,mongodb中多表关联查询的话是没有join的;
在 MongoDB 中抛弃了这种关联的思路来设计表结构,在 MongoDB 中提倡的设计思路可能是建立一个客户表,在表中包含业务需要的尽可能多的数据信息,这样最终会产生一些冗余信息,但是在 NoSQL 的世界里是提倡这样做的。
与上面的业务需求相同,则最终插入的文档对象 document 结构如下所示:
db.customers.insert({
cust_id:123,
name:"xiaoming",
address:"china beijing",
mobile:"999999",
orders:[
{
order_id:1,
createTime:"2020-2-6",
products: [
{
prod_name: "surface Pro64G"