当前位置: 首页 > news >正文

MongoDB创建和查询视图(二)

目录

基于$lookup创建关联查询视图

创建带有默认字符序的视图

字符序

创建视图

视图中的字符序


基于$lookup创建关联查询视图

基于$lookup命令,通过集合的关联查询,用户可以创建基于两个集合的视图并查询视图数据。应用在构建查询时,无需每次构建和维护复杂的管道查询。

  • 构建用于创建视图的两个集合, inventory集合和orders集合
db.inventory.insertMany([{ prodId: 100, price: 20, quantity: 125},{ prodId: 101, price: 10, quantity: 234},{ prodId: 102, price: 15, quantity: 432},{ prodId: 103, price: 17, quantity: 320}
])db.orders.insertMany([{ orderId: 201, custid: 301, prodId: 100, numPurchased: 20},{ orderId: 202, custid: 302, prodId: 101, numPurchased: 10},{ orderId: 203, custid: 303, prodId: 102, numPurchased: 5},{ orderId: 204, custid: 303, prodId: 103, numPurchased: 15},{ orderId: 205, custid: 303, prodId: 103, numPurchased: 20},{ orderId: 206, custid: 302, prodId: 102, numPurchased: 1},{ orderId: 207, custid: 302, prodId: 101, numPurchased: 5},{ orderId: 208, custid: 301, prodId: 100, numPurchased: 10},{ orderId: 209, custid: 303, prodId: 103, numPurchased: 30}
])
  • 创建关联查询视图
db.createView("v_sales",  // 视图名称"orders",   // 基于orders集合创建视图[{$lookup: {// 通过lookup查询inventory集合from: "inventory",localField: "prodId",foreignField: "prodId",as: "inventoryDocs"}
}, {$project: { //指定输出字段_id: 0,prodId: 1, orderId: 1,numPurchased: 1,price: "$inventoryDocs.price"}
}, {$unwind: "$price" //将price数组打平
}])
  • 查询视图
db.v_sales.find()/* 1 */
{"orderId" : 201,"prodId" : 100,"numPurchased" : 20,"price" : 20
},/* 2 */
{"orderId" : 202,"prodId" : 101,"numPurchased" : 10,"price" : 10
},
...

创建带有默认字符序的视图

字符序

字符集中字符串的排列顺序,用于指定字符串的比较规则,包括大小写比较规则,发音标记规则顺序等。

创建视图

Mongodb官网中,展示了一个带有默认字符序的视图

  • 创建一个不同cafe值的集合
db.places.insertMany([{ _id: 1, category: "café" },{ _id: 2, category: "cafe" },{ _id: 3, category: "cafE" }
])
  • 基于上述集合,创建一个视图,并指定字符序
db.createView("placesView", "places", [ { $project: {category: 1}}], {collation: { locale: "fr", strength: 1}})
  • 查看视图数据
db.placesView.countDocuments({ category: "cafe"})
//结果返回3

视图中的字符序

  • 用户可以在创建视图时,指定字符序。如果没有指定字符序,视图默认的字符序就是简单的二进制字符序。视图并不会继承集合的默认字符序。
  • 视图中字符比较,使用默认的字符序。禁止尝试修改或覆盖字符序的操作
  • 基于已有view创建的视图,不可以指定与原始图不同的字符序
  • 在多个view中进行aggregation查询时,如$lookup, $graphLookup命令,使用的视图必须有相同的字符序。
//基于placesView创建新的视图,指定不同的字符序,创建失败。
db.createView("placesView2", "placesView", [ { $project: {category: 1}}], {collation: { locale: "en", strength: 1}})
{"message" : "View test.placesView2 has conflicting collation with view test.placesView","ok" : 0,"code" : 167,"codeName" : "OptionNotSupportedOnView"
}
//使用$lookup查询视图和不同字符序的集合,查询失败
db.places.aggregate()
.lookup({from: "placesView",localField: "category",foreignField: "category",as: "categoryViews"})
{"message" : "Cannot override a view's default collationtest.placesView","ok" : 0,"code" : 167,"codeName" : "OptionNotSupportedOnView"
}

http://www.lryc.cn/news/266871.html

相关文章:

  • 【MYSQL】MYSQL 的学习教程(七)之 慢 SQL 优化思
  • iOS - 真机调试的新经验
  • thinkphp6.0的workerman在PHP8.0下报错
  • SQL语句分类
  • C# Onnx yolov8 pokemon detection
  • Flink电商实时数仓(六)
  • 本地部署Jellyfin影音服务器并实现远程访问内网影音库
  • 【React Native】第一个Android应用
  • 解决IOS transform rotate后文字无法显示,backface-visibility导致@click事件失效
  • Nature | 大型语言模型(LLM)能够产生和发现新知识吗?
  • 多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测
  • Nature 新研究发布,GPT 驱动的机器人化学家能够自行设计和进行实验,这对科研意味着什么?
  • Ai画板原理
  • 【hacker送书第11期】Python数据分析从入门到精通
  • 华为OD机试 - 精准核酸检测(Java JS Python C)
  • 智能优化算法应用:基于材料生成算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 【MySQL】:超详细MySQL完整安装和配置教程
  • OpenAI亲授ChatGPT “屠龙术”!官方Prompt 工程指南来啦
  • 最新ChatGPT商业运营网站程序源码,支持Midjourney绘画,GPT语音对话+DALL-E3文生图+文档对话总结
  • 经验 | IDEA常用快捷键
  • spark中 write.csv时, 添加第一行的标题title
  • HTML美化网页
  • nn.LSTM个人记录
  • vr虚拟高压电器三维仿真展示更立体全面
  • 轮廓平滑方法
  • 十大VSCODE 插件推荐2023
  • HBase 集群搭建
  • 大三了,C++还算可以从事什么岗位比较好?
  • java 贪吃蛇游戏
  • 聊聊Java算法的时间复杂度