MongoDB原生脚本的CURD--官方文档阅读笔记

安装&登录

0、Windows下使用从MongoDB官网下载MSI安装文件,感觉比zip的安装包使用便捷。Ubuntu Linux下使用sudo apt install mongodb-server安装、其配置文件路径为/etc/mongodb.conf、可以通过在其中配置数据库路径。

在这里插入图片描述

Mac下使用brew install mongodb,其配置信息可参考如下:

在这里插入图片描述

1、mongod --bind_all  默认只能本机访问MongoDB、使用此选项可以让别的机器通过网络访问 2、如果不能访问,检查端口是否开放,默认为27017。AWS的EC2需要在入站规则中加入该端口才会生效。 3、使用mongo进入数据库后、创建用户与密码。

Mongo Shell

insert

db.collection.insert(
   <document or array of documents>,
   {
     writeConcern: <document>, // 
     ordered: <boolean> // 按顺序插入
   }
)
db.inventory.insertOne(
   { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)

save

Updates an existing document or inserts a new document, depending on its document parameter.

query

一般查询:

db.inventory.find( {} )
db.inventory.find( { status: "D" } )

使用查询操作符查询:更多查询操作符:https://docs.mongodb.com/manual/reference/operator/query/

// 格式:{ <field1>: { <operator1>: <value1> }, ... }
db.inventory.find( { status: { $in: [ "A", "D" ] } } )

使用AND

// status==‘A’ && qty < 30
db.inventory.find( { status: "A", qty: { $lt: 30 } } )

使用OR

// status==‘A’ || qty < 30
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

// status=='A' && (qty < 30 || item like 'p%')
db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )

正则表达式详细可参考:https://docs.mongodb.com/manual/reference/operator/query/regex/

/* 格式:
{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }
-----
{ <field>: /pattern/<options> }
*/
----------------------------------------------------------
// 查询title以h开头的文档,options里面有i说明大小写不敏感
db.bizQuestion.find( {
	title : {$regex : /^h/, $options:'i'}
} )

两种格式的使用场景存在差异,具体可参考上述链接:

{ name: { $in: [ /^acme/i, /^ack/ ] } } // 这里只能使用第二种格式
在这里插入图片描述

如果文档中的某个字段的值是文档

// 插入--注意size的结构
db.inventory.insertMany( [
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
// 接着上面的进行查询。
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )   // OK
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )   // X, 注意顺序,这里匹配不到任何东西

执行效果如下:

在这里插入图片描述

如果只以size中的某一个字段为查询域

db.inventory.find( { "size.uom": "in" } )
db.inventory.find( { "size.h": { $lt: 15 } } )
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )

其中的字段还可以为一个数组,数组中的数据可以是一个简单的类型,如整数、字符串等,也可以还是一个文档。对于这些情况,其查询方式存在或多或少的差异,可以在需要的时候参考官方文档。

如何返回自己想要的字段

前面查询得到的结果都是全部的字段,如果不需要返回所有的字段,可以通过设置projection来达到目的,projection的解释:

A document given to a query that specifies which fields MongoDB returns in the result set.

其中还包括字段为数组以及数组中的字段为文档的多种情况。

// 初始数据结构
db.inventory.insertMany( [
  { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
  { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
  { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
  { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

// 返回结果显示item,status,不显示_id
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
// 如果字段的值也是一个文档
db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)
// 字段为数组,数组的类型是文档
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

update

db.books.update(
  { _id: 1 },
  {
    $inc: { stock: 5 },
    $set: {
      item: "ABC123",
      "info.publisher": "2222",
      tags: [ "software" ],
      "ratings.1": { by: "xyz", rating: 3 }
    }
  }
)
-------------------------------------------------------------------
try {
  db.restaurant.updateMany(
    { violations: { $gt: 4 } },
    { $set: { "Review" : true } }
  );
} catch (e) {
  print(e);
}
-------------------------------------------------------------------
// The following operation updates a single document where name: "Central Perk Cafe" with the violations field:

try {
  db.restaurant.updateOne(
    { "name" : "Central Perk Cafe" },
    { $set: { "violations" : 3 } }
  );
} catch (e) {
  print(e);
}
-------------------------------------------------------------------
// The following operation attempts to update the document with name : "Pizza Rat's Pizzaria", while upsert: true :
// 对于这个upsert:true这个参数,update--insert。如果为true并且前面的query没有匹配到,则会进行插入,否则更新。
try {
  db.restaurant.updateOne(
    { "name" : "Pizza Rat's Pizzaria" },
    { $set: {"_id" : 4, "violations" : 7, "borough" : "Manhattan" } },
    { upsert: true }
  );
} catch (e) {
  print(e);
}

Read more

Volcano 与 Kubernetes GPU 调度学习笔记

本笔记系统整理 Volcano 调度器、Kubernetes 调度框架、GPU Device Plugin、HAMi 等云原生 AI 调度领域的核心知识,适合用于学习、复习和工程实践参考。 目录 * 第一部分:Volcano 入门 * 1. Volcano 是什么 * 2. 安装与快速使用 * 3. 核心特性一览 * 第二部分:Volcano 整体架构 * 4. Volcano 解决的核心问题 * 5. 整体架构与数据流 * 6. 三层抽象模型 * 第三部分:Volcano 核心实现原理 * 7. Session 机制 * 8. Gang Scheduling 实现 * 9. Queue 与 DRF 公平调度

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd