网站做中秋专题怎么弄,wordpress 增加注册页面,上海的建设网站,wordpress文章 相册目录 MongoDB 的 集合关联演示前提#xff1a;登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 SQL 术语 与 Mongodb 的对应关系使用 $lookup 实现集合关联语法格式添加测试数据1、查询出订单数量大于6登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 SQL 术语 与 Mongodb 的对应关系使用 $lookup 实现集合关联语法格式添加测试数据1、查询出订单数量大于6及其对应的商品1-1查询出订单中【amount】数量大于6的订单1-2查询出订单中【amount】数量大于 6 的订单及其对应的商品查询命令命令解释查询结果 2、查询出价格为 30 的商品所关联的全部订单2-1查询【item】集合中价格为 30 的商品:2-2查询出价格为 30 的商品所关联的全部订单查询命令命令解释查询结果 使用 DBRef 实现集合关联语法格式添加测试数据1、查询标题为 “标题2 的 comment 及对应的商品1-1查询标题为 “标题2 的 comment查询命令查询结果 1-2查询标题为 “标题2 的 comment 文档 及 对应的商品查询返回的文档只有一条数据查询命令查询结果 查询返回的文档有多条数据查询命令查询结果 MongoDB 的 集合关联
演示前提 登录单机模式的 mongodb 服务器命令
mongod.exe --config E:\install\mongodb\mongodb-4.2.25\mongod.conf登录【test】数据库的 mongodb 客户端命令
mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456登录【admin】数据库的 mongodb 客户端命令
mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456SQL 术语 与 Mongodb 的对应关系 使用 $lookup 实现集合关联 语法格式
在聚集运算使用如下文档 {$lookup:{from: 指定要连接的集合localField: 指定本集合中文档的主键字段foreignField: 指定要连接的集合中的外键字段as: 指定被连接对象的属性名}}localField 和 foreignField 指定两个集合之间的关联条件 添加测试数据
原本的 item 集合有这些数据 价格为 30 的【键盘】和 订单 1、2、3相关联 价格为 60 的【鼠标】和 订单 4、5 相关联
db.order.insert([{item_id: ObjectId(65e6cb5e055c945aa89b8575), name: 订单1, amount: 3},{item_id: ObjectId(65e6cb5e055c945aa89b8575), name: 订单2, amount: 5},{item_id: ObjectId(65e6cb5e055c945aa89b8575), name: 订单3, amount: 8},{item_id: ObjectId(65e6cb5e055c945aa89b8578), name: 订单4, amount: 4},{item_id: ObjectId(65e6cb5e055c945aa89b8578), name: 订单5, amount: 7}
])如图生成一个【order】的订单集合相当于sql的订单表。 1、查询出订单数量大于6及其对应的商品 1-1查询出订单中【amount】数量大于6的订单 1-2查询出订单中【amount】数量大于 6 的订单及其对应的商品 查询命令 db.order.aggregate([{$match: {amount: {$gt: 6}}},{ $lookup: {from: item,localField: item_id,foreignField: _id,as: item_detail}}
])命令解释 db.order.aggregate([ //aggregate 表示对 MongoDB 中的 order 集合执行聚集运算{$match: {amount: {$gt: 6}}}, //这是聚合管道中的第一个阶段相当于where 条件查询 amount 6 的订单 { $lookup: // 这是聚合管道中的第二个阶段使用 $lookup 操作符来执行关联查询{from: item, //指定要连接的集合这里是连接【item】这个集合表localField: item_id, // 指定当前集合order中用于关联的字段为 item_idforeignField: _id, //指定要关联的集合item中用于关联的字段为 _idas: item_detail //指定将关联查询的结果存储到名为 item_detail 的字段中}}
])相当于 SQL 中的 join 查询
select * from order o
join item i on o.item_id i . _id
where o.amout 6;查询结果 2、查询出价格为 30 的商品所关联的全部订单 2-1查询【item】集合中价格为 30 的商品:
db.item.aggregate([{$match:{price:30}}
])2-2查询出价格为 30 的商品所关联的全部订单
查询命令
db.item.aggregate([{$match: {price: 30}},{$lookup: {from: order,localField: _id,foreignField: item_id,as: order_array}}
])命令解释
db.item.aggregate([{$match: {price: 30}}, //这是聚合管道中的第一个阶段用于筛选出【item】集合中 price 等于 30 的 数据{$lookup: { //这是聚合管道中的第二个阶段使用 $lookup 操作符来执行关联查询from: order, //指定要关联查询的集合为 orderlocalField: _id, //指定当前集合item中用于关联的字段为 _idforeignField: item_id, //指定要关联的集合order中用于关联的字段为 item_idas: order_array //指定将关联查询的结果存储到名为 order_array 的字段中}}
])查询结果 使用 DBRef 实现集合关联 语法格式
DBRef 尽可能地模拟了SQL数据库中外键——指定要引用哪个表的哪个列。
插入文档时使用 DBRef 引用其他文档DBRef 的完整形式
{ $ref : 被引用的集合名 , $id : 被引用的文档主键 value , $db : 被引用的数据库 }
如果被引用的集合在同一个数据库中$db 可以省略。
通过 DBRef 的 fetch() 方法即可抓取关联文档。 添加测试数据
db.comment.insert([{item: {$ref: item, $id: ObjectId(65e6cb5e055c945aa89b8575)}, title: 标题1, body: 评论内容1},{item: {$ref: item, $id: ObjectId(65e6cb5e055c945aa89b8575)}, title: 标题2, body: 评论内容2},{item: {$ref: item, $id: ObjectId(65e6cb5e055c945aa89b8575)}, title: 标题3, body: 评论内容3},{item: {$ref: item, $id: ObjectId(65e6cb5e055c945aa89b8575)}, title: 标题4, body: 评论内容4},{item: {$ref: item, $id: ObjectId(65e6cb5e055c945aa89b8575)}, title: 标题5, body: 评论内容5}
])item 这是一个嵌套的字段包含了一个引用到 item 集合中某个文档的信息。
$ref: “item” 指定了引用的集合为 item。
$id: ObjectId(“65e6cb5e055c945aa89b8575”) 指定了引用的文档的 ObjectId。
如图引用了 item 集合中的 id 为 【65e6cb5e055c945aa89b8575】 的文档 测试数据 1、查询标题为 “标题2 的 comment 及对应的商品 1-1查询标题为 “标题2 的 comment 查询命令
db.comment.findOne({title: 标题2})查询结果 1-2查询标题为 “标题2 的 comment 文档 及 对应的商品
【备注】如果你已经用了 DBRef 来记录关联程序可以非常方便处理关联压根不需要使用 $lookup 查询返回的文档只有一条数据 查询命令
db.comment.findOne({title: 标题2}).item.fetch()查询结果
在 studio 3t 这个图形界面工具查询就出错。 修改成这样
db.comment.findOne({title: 标题2}, {item: 1})在命令行窗口查询就可以 查询返回的文档有多条数据
如果查询的包含了多个文档且要通过DBRef获取关联文档时 由于 find() 方法返回的是 DBCursor因此需要先遍历 DBCursor然后在通过查询文档的关联属性来获取关联的文档。
DBCursor 有一个 forEach 方法该方法需要传入一个 JS 的 function( c ) {c就代表了正则遍历的文档} 通过该函数可对DbCursor中多个文档进行遍历。 查询命令
db.comment.find({title: 标题2}).forEach(function(c){print(JSON.stringify(c) JSON.stringify(c.item.fetch()));
})查询结果