NoSQLBooster4MongoDB - 用SQL查询MongoDB

news2024/11/19 3:40:03

最好的MongoDB的客户端工具–NoSQLBooster。NoSQLBooster立志做“The Smartest IDE for MongoDB”。

使用 mb.runSQLQuery()方法,能把SQL语句翻译成MongoDB的查询语句.

借助适用于 MongoDB 的 NoSQLBooster,您可以针对 MongoDB 运行 SQL SELECT 查询。 SQL 支持包括函数、表达式、具有嵌套对象和数组的集合的聚合。 请参阅 NoSQLBooster for MongoDB 支持的 功能和 SQL 示例。

让我们看看如何在 SQL 中将 GROUP BY 子句与 SUM 函数一起使用。

而不是编写表示为类似 JSON 结构的 MongoDB 查询

db.employees.aggregate([
    {
        $group: {
            _id: "$department",
            total: { $sum: "$salary" }
        },
    }
])

您可以使用您可能已经知道的 SQL 查询 MongoDB。

mb.runSQLQuery(`
  SELECT department, SUM(salary) AS total FROM employees GROUP BY department
`);

再来看一个比较复杂的SQL语句,看看NoSQLBooster是怎么翻译的:

等效的 MongoDB SQL查询:

select 	CITY as CITY_NAME,	count(*) as COUNT_STORE,	sum(AVGSCORE) as AVG_SCORE,	sum(AVGPRICE) as AVG_PRICE
from
	store_detail_info
where
	CITY_NAME in ("上海", "北京", "广州")
group by
	CITY_NAME
order by
	COUNT_STORE desc

到 MongoDB Script:

db.store_detail_info.aggregate([{
  $addFields: {
    CITY_NAME: "$CITY"
  }
}, {
  $match: {
    CITY_NAME: {
      $in: ["上海", "北京", "广州"]
    }
  }
}, {
  $group: {
    _id: {
      CITY_NAME: "$CITY_NAME"
    },
    COUNT_STORE: {
      $sum: NumberInt(1)
    },
    AVG_SCORE: {
      $sum: "$AVGSCORE"
    },
    AVG_PRICE: {
      $sum: "$AVGPRICE"
    }
  }
}, {
  $project: {
    CITY_NAME: "$_id.CITY_NAME",
    COUNT_STORE: "$COUNT_STORE",
    AVG_SCORE: "$AVG_SCORE",
    AVG_PRICE: "$AVG_PRICE"
  }
}, {
  $sort: {
    COUNT_STORE: -1
  }
}])

特性

  • 通过 SQL 访问数据,包括 WHERE 过滤器、ORDER BY、GROUP BY、HAVING、DISTINCT、LIMIT
  • SQL 函数(COUNT、SUM、MAX、MIN、AVG)
  • SQL 函数(日期、字符串、转换)
  • SQL Equi JOIN 和不相关子查询
  • 聚合管道运算符作为 SQL 函数(dateToString、toUpper、split、substr …)
  • 提供可以集成到您的脚本中的编程接口(mb.runSQLQuery)
  • 关键字、MongoDB 集合名称、字段名称和 SQL 函数的自动完成

📝注意: MongoDB 本身不支持 SQL 功能。 SQL 查询经过验证并转换为 MongoDB 查询,并由 NoSQLBooster for MongoDB 执行。 可以在 console.log 选项卡中查看等效的 MongoDB 查询。

应该提到的是,在左下角的“Samples”窗格中有一个关于 NoSQLBooster SQL Query for MongoDB 的教程。 通过本教程,您可以学习和理解如何使用 NoSQLBooster SQL Query for MongoDB。 更好的是,所有 SQL 函数都提供适当的代码片段和鼠标悬停信息并支持代码完成。
在这里插入图片描述

开始

例如,员工集合有以下字段,包括number、first_name、last_name、salary、department 和hire_date。

准备演示数据

将以下演示数据插入 MongoDB。 打开 shell 选项卡Ctrl-T并执行以下脚本以获取员工集合。

db.employees.insert([   
  {"number":1001,"last_name":"Smith","first_name":"John","salary":62000,"department":"sales", hire_date:ISODate("2016-01-02")},
  {"number":1002,"last_name":"Anderson","first_name":"Jane","salary":57500,"department":"marketing", hire_date:ISODate("2013-11-09")},
  {"number":1003,"last_name":"Everest","first_name":"Brad","salary":71000,"department":"sales", hire_date:ISODate("2017-02-03")},
  {"number":1004,"last_name":"Horvath","first_name":"Jack","salary":42000,"department":"marketing", hire_date:ISODate("2017-06-01")},
])

选择所有字段

首先,单击员工集合,然后单击选项卡工具栏中的“SQL 查询选项卡”或使用Ctrl-Alt-T键盘快捷键。 自动为我们生成基本的“SELECT * from employees”! NoSQLBooster for MongoDB 还提供了一个“runSQLQuery”代码片段。 只需键入片段前缀“run”,然后按“tab”即可插入该片段。
在这里插入图片描述
只需单击执行按钮或使用“Ctrl-↵”键盘快捷键即可执行查询。This would produce the result, as shown below.
在这里插入图片描述

  • NoSQLBooster for MongoDB 在结果树视图中提供就地编辑。 双击任何值或数组元素进行编辑。 按 Esc 返回之前的值并退出编辑器。
  • 如果您不想直接编辑结果,可以通过单击工具栏的锁定按钮使用**“只读”**模式。

选择单个字段和字段名称自动完成

让我们获取 employees 表中可用员工的 first_name、last_name 和 salary 字段,并按薪水降序对结果进行排序。
在这里插入图片描述
内置的SQL语言服务知道所有可能的补全、SQL函数、关键字、MongoDB集合名和字段名。当你打字时,智能提示就会弹出。你可以用Ctrl-Shift-Space手动触发它。开箱即用,Ctrl-SpaceAlt-Space也是可以接受的触发器。

查看等效的 MongoDB 查询

如何显示等效的 MongoDB 查询?

  • 方法一:开启Verbose Shell选项,Main Menu->Options -> Verbose Shell(setVerboseShell)
  • 方法 2:单击编辑器工具栏右上角的**“Code”按钮**以显示等效的 MongoDB 查询。
    在这里插入图片描述
    如您所知,NoSQLBooster for MongoDB 支持mongoose-like fluent Query API,点击“Menu-> Options -> Translate SQL to MongoDB Shell Script”,点击“Translate SQL to NoSQLBooster for MongoDB Fluent API”。 重新执行脚本,等效的流畅 MongoDB 查询将显示在“console.log/print”选项卡中。
    在这里插入图片描述

使用字符串和日期 SQL 函数

这次,我们要查找今年雇用的所有员工,并将 first_name 和 last_name 显示为全名。 请输入以下SQL语句并点击执行按钮:

SELECT  concat("first_name", ' ', "last_name") as fullname,
      dateToString('%Y-%m-%d',"hire_date") as hiredate 
FROM employees 
WHERE "hire_date" >= date('2017-01-01') 

单击“console.log/print”选项卡以显示等效的 MongoDB 查询:

db.employees.aggregate(
  [{
      "$match": {
        "hire_date": {
          "$gte": ISODate("2017-01-01T08:00:00.000+08:00")
        }
      }
    },
    {
      "$project": {
        "fullname": {
          "$concat": [
            "$first_name",
            " ",
            "$last_name"
          ]
        },
        "hiredate": {
          "$dateToString": {
            "format": "%Y-%m-%d",
            "date": "$hire_date"
          }
        }
      }
    }
  ])

在这里插入图片描述
让我们看看 concat 函数 concat(“first_name”, ’ ', “last_name”)。 concat 函数是一个 MongoDB 字符串聚合运算符。 通过将 SQL 函数映射到 MongoDB 运算符,NoSQLBooster for MongoDB 允许您在 SQL 语句中将所有 MongoDB 聚合运算符用作 SQL 函数。

// instead of writing
{ $concat: [ "$first_name", " ", "last_name" ] }

// we write,  
concat("first_name", ' ', "last_name") //Double quotes quote field name, Single quotes are for strings

// or 
concat(first_name, ' ', last_name)  //allow to omit double quotes
  1. MongoDB 运算符和集合字段名称没有 $ 前缀。
  2. 双引号引用字段名。 单引号用于字符串。
  3. 除了 COUNT、SUM、MAX、MIN、AVG 之外,所有函数名称都区分大小写。
  4. 我们可以使用标准的 SQL 比较运算符:=、!=、<>、<、<=、>= 或 >

日期函数将字符串转换为 MongoDB 日期类型。 NoSQLBooster for MongoDB 使用 Moment.js 来解析日期字符串。 从字符串创建日期时,Moment.js 首先检查字符串是否与已知的 ISO 8601 格式匹配,然后 Moment.js 检查字符串是否与 RFC 2822 日期时间格式匹配,然后再返回 new Date(string) 如果找不到已知格式。

请参考Moment.js解析字符串文档查看所有支持的字符串格式。

# An ISO 8601 string requires a date part.

2013-02-08  # A calendar date part

#A time part can also be included, separated from the date part by a space or an uppercase T.
2013-02-08 09:30         # An hour and minute time part
2013-02-08 09:30:26      # An hour, minute, and second time part

#If a time part is included, an offset from UTC can also be included as +-HH:mm, +-HHmm, +-HH or Z.

2017-01-01T08:00:00.000+08:00
2013-02-08 09+07:00            # +-HH:mm
2013-02-08 09:30:26.123+07:00  # +-HH:mm

dateToString 是另一个 MongoDB 日期运算符,用于根据用户指定的格式将日期对象转换为字符串。 $dateToString 表达式具有以下语法:

{ $dateToString: { format: <formatString>, date: <dateExpression> } }

由于 SQL 函数不支持 JSON 对象参数,NoSQLBooster for MongoDB 将对象参数转换为普通参数列表。

dateToString('%Y-%m-%d',"hire_date") as hiredate 

第一个参数是formatString,单引号,第二个参数是“Date Field”,双引号。

请点击此链接 了解有关 MongoDB 日期聚合运算符的更多信息。

一个日期范围的例子:

#----The equivalent MongoDB Query:----
#From SQL:
select * from my_events where dateTime >= date('2022-06-10T17:00:00.000Z') and dateTime <= date('2022-06-20T11:00:00.000Z')

#To MongoDB Script:
db.my_events.aggregate([{
  $match: {
    $and: [{
      dateTime: {
        $gte: ISODate("2022-06-10T17:00:00.000Z")
      }
    }, {
      dateTime: {
        $lte: ISODate("2022-06-20T11:00:00.000Z")
      }
    }]
  }
}])

引用名称和字符串值

在 NoSQLBooster 中,我们遵循 ANSI SQL 标准。 单引号分隔字符串常量或日期/时间常量。 双引号分隔标识符,例如集合名称或列名称。 通常仅当您的标识符不符合简单标识符的规则时才需要这样做。

以下 SQL 语句从“employees”集合中的部门“sales”中选择所有客户:

SELECT * FROM employees WHERE department='sales';

等效的 MongoDB 查询

db.employees.find({
  "department": "sales"
})

单引号用于字符串。 如果您将“sales”加双引号,MongoDB 的 NoSQLBooster 会将其视为列“sales”,而不是字符串“sales”。

SELECT * FROM employees WHERE department="sales";

SQL 生成了您可能不需要的以下 MongoDB 查询。

db.employees.aggregate(
  [{
      "$addFields": {
        "__tmp_cond_1": {
          "$eq": [
            "$department",
            "$sales"
          ]
        }
      }
    },
    {
      "$match": {
        "__tmp_cond_1": true
      }
    },
    {
      "$project": {
        "__tmp_cond_1": 0
      }
    }
  ])

💡提示: 坚持使用单引号。

解释查询的数据

只需在 mb.runSQLQuery 的末尾添加一个新行“.explain()”,然后再次单击执行按钮。 它返回有关管道处理的信息。
在这里插入图片描述

查询特殊的 BSON 数据类型,UUID,BinData,DBRef …

要查询这些特定BSON数据类型的值,请像在MongoDB shell中那样写入这些值。所有MongoDB内置的数据类型函数都可用。

    --date
    SELECT * FROM collection WHERE date_field >= date("2018-02-09T00:00:00+08:00")
    SELECT * FROM collection WHERE date_field >= ISODate("2018-02-09")

    --number
    SELECT * FROM collection WHERE int64_field >= NumberLong("3223123123122132992") 
    SELECT * FROM collection WHERE decimal_field = NumberDecimal("8989922322323232.12")

    --Regular Expression
    SELECT * FROM collection WHERE string_field = RegExp('query','i')

    --binary
    SELECT * FROM collection WHERE objectId_field = ObjectId("56034dae9b835b3ee6a52cb7")
    SELECT * FROM collection WHERE binary_field = BinData(0,"X96v3g==")
    SELECT * FROM collection WHERE md5_field = MD5("f65485ac0686409aabfa006f0c771fbb")
    SELECT * FROM collection WHERE hex_field = HexData(0,"00112233445566778899aabbccddeeff")

    --uuid
    SELECT * FROM collection WHERE uuid_field = UUID("4ae5bfce-1dba-4776-80eb-17678822b94e")
    SELECT * FROM collection WHERE luuid_field = LUUID("8c425c91-6a72-c25c-1c9d-3cfe237e7c92")
    SELECT * FROM collection WHERE luuid_field = JSUUID("8c425c91-6a72-c25c-1c9d-3cfe237e7c92")
    SELECT * FROM collection WHERE luuid_field = CSUUID("6a72c25c-5c91-8c42-927c-7e23fe3c9d1c")
    SELECT * FROM collection WHERE luuid_field = PYUUID("5cc2726a-915c-428c-927c-7e23fe3c9d1c")

    --timstamp
    SELECT * FROM collection WHERE timestamp_field = Timestamp(1443057070, 1)
    --symbol
    SELECT * FROM collection WHERE symbol_field = Symbol('I am a symbol')
    --dbref
    SELECT * FROM collection WHERE dbref_field = DBRef("unicorns", ObjectId("55f23233edad44cb25b0d51a"))
    --minkey maxkey
    SELECT * FROM collection WHERE minkey_field = MinKey and maxkey_field = MaxKey

    --array, array_field is [1, 2, '3']
    SELECT * FROM collection WHERE array_field = [1,2,'3']

    --object, object_field is { a : 1, b : {b1 : 2,    b2 : "b2"}
    SELECT * FROM collection WHERE object_field = toJS(a=1, b=toJS(b1=2, b2='b2'))

访问数组和嵌入式文档

支持嵌套文档(子文档)和数组,包括过滤器和表达式。 您可以使用带点的名称访问此类字段。

例如集合中的以下文档:

db.survey.insert([   
  { _id: 1, results: [ { product: "abc", score: 10 }, { product: "xyz", score: 5 } ]},
  { _id: 2, results: [ { product: "abc", score: 8 }, { product: "xyz", score: 7 } ]},
  { _id: 3, results: [ { product: "abc", score: 7 }, { product: "xyz", score: 8 } ]}
])

“product”和“score”将分别作为 “results.product” 和 “results.score” 引用:

SELECT * FROM survey  WHERE results.product = 'xyz' AND results.score >= 8;

或者

SELECT * FROM survey  WHERE "results.product" = 'xyz' AND "results.score" >= 8;

与嵌入文档的元素匹配

elemMatch 查询条件 (score >=8) 将被翻译为 "score": { "$gte": 8 }。 这种语法更加简洁和表达。

--  Enter "elemMatch [Tab]", to trigger auto-complete
SELECT * FROM survey WHERE "results" =elemMatch(product='xyz', score >=8)

SQL 相等连接

NoSQLBooster 支持 SQL Equi JOIN,它针对关联表的相等或匹配列值执行 JOIN。 等号 (=) 在 where 子句中用作比较运算符以引用相等性。

NoSQLBooster 支持 INNER JOIN 和 LEFT JOIN,不支持 OUTER JOIN。

  1. (INNER) JOIN: 返回在两个表中都具有匹配值的记录
  2. LEFT JOIN: 返回左表中的所有记录,以及右表中匹配的记录

Equi JOIN 会被翻译成 MongoDB $lookup stage。 (MongoDB 3.2+) 参考:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup

   SELECT * FROM orders JOIN inventory ON orders.item=inventory.sku

“toJS”SQL 函数和命名参数

“toJS”辅助函数将命名参数和算术运算符转换为 JSON 对象,还将普通参数列表转换为数组。

toJS(k='v'); //result {k:'v'}
toJS(k="v"); //result {k:'$v'}, Double quotes quote object names
toJS(k=v); //result {k:'$v'}, without quote, v is a object name
toJS(k>5, k<=10); //result  { "k": { "$gt": 5, "$lte": 10} }
toJS(a=1, b=toJS(b1=2, b2='b2')); //result {a : 1, b : {b1 : 2,    b2 : "b2"}
toJS(1, 2,'3'); // result  [1,2,'3'];

使用命名参数和“toJS”辅助函数,您可以查询复杂对象或将 JSON 对象参数传递给 SQL 函数。

--elemMatch, named parameter and Arithmetic operators
--cool stuff,  (score>8, score<=10) will be translated as  {"score": { "$gt": 8, "$lte": 10 }}
SELECT * FROM survey WHERE results =elemMatch(item='abc', score>8, score<=10)

--date timezone, named parameter
SELECT year(date="date", timezone='America/Chicago') as year FROM sales

--query object type value, object_field: { a : 1, b : {b1 : 2,    b2 : "b2"}
SELECT * FROM collection WHERE object_field = toJS(a=1, b=toJS(b1=2, b2='b2'))

-- text search with full-text search options
SELECT * FROM article WHERE 
   $text = toJS($search='cake',  $language='en', $caseSensitive=false, $diacriticSensitive=false) 

SELECT literal(toJS(k>5, k<=10))  FROM collection

Mixed-use of SQL and Chainable Aggregation Pipeline

MongoDB的NoSQLBooster将SQL转换为MongoDB find/aggregate方法,该方法返回一个AggregateCursor。所有的MongoDB游标方法和MongoDB的NoSQLBooster扩展方法都可以调用。这还允许NoSQLBooster智能感知了解AggregateCursor的所有可链阶段方法。(sort, limit, match, project, unwind…)

mb.runSQLQuery(`
       SELECT * FROM "survey" where type='ABC' and year(date) = 2018 ORDER BY "results.score" DESC
`)
.unwind('$tags')
.project("-_id") //alias select
.limit(1000)

The equivalent MongoDB Query is a bit longer.

db.survey.aggregate(
[
    {
        "$addFields" : {
            "year(date)" : {
                "$year" : "$date"
            }
        }
    },
    {
        "$match" : {
            "type" : "ABC",
            "year(date)" : 2018
        }
    },
    {
        "$project" : {
            "year(date)" : 0
        }
    },
    {
        "$sort" : {
            "results.score" : -1
        }
    },
    {
        "$unwind" : "$tags"
    },
    {
        "$project" : {
            "_id" : 0
        }
    },
    {
        "$limit" : 1000
    }
])

将 SQL 查询保存为 MongoDB 只读视图

您可以使用扩展方法“saveAsView”将 SQL 查询结果保存为 MongoDB 只读视图。

//double quotes quote object names (e.g. "collection"). Single quotes are for strings 'string'.
mb.runSQLQuery("
      SELECT  concat(first_name, ' ', last_name) as fullname,
            dateToString('%Y-%m-%d',hire_date) as hiredate 
      FROM employees 
      WHERE hire_date >= date('2017-01-01') 

").saveAsView("Employers_hired_after_2017", {dropIfExists:true}) //drop view if it exists.

您还可以使用 forEach 方法将 javascript 方法应用于每个文档。

mb.runSQLQuery("SELECT * FROM employees WHERE hire_date >= date('2017-01-01')")
  .forEach(it=>{
    //sendToMail(it)
  });

SQL 片段

NoSQLBooster 包含许多 SQL 特定的代码片段以节省您的时间、日期范围、文本搜索、查询和数组、存在性检查、类型检查等。 您始终可以使用 Ctrl-Shift-Space 手动触发它。 开箱即用,Ctrl-SpaceAlt-Space 是可接受的触发器。

SQL 日期范围片段

--  Enter "daterange [Tab]," then..., today, yesterday, lastNDays
SELECT * FROM collection WHERE
  "|" >= date("2018-02-09T00:00:00+08:00") and "|" < date("2018-02-10T00:00:00+08:00")

文本搜索片段

--  Enter "text [Tab]", then...
SELECT * FROM collection WHERE $text = toJS($search='|')

--  Enter "textopt [Tab]", then...
--  with full-text search options
SELECT * FROM collection WHERE 
   $text = toJS($search='|',  $language='en', $caseSensitive=false, $diacriticSensitive=false) 

等效的 MongoDB 文本搜索

db.collection.find({
  "$text": {
    "$search": "|",
    "$language": "en",
    "$caseSensitive": false,
    "$diacriticSensitive": false
  }
})

查询数组($all$elemMatch)片段

$elemMatch 运算符匹配包含数组字段的文档,该数组字段至少有一个元素匹配所有指定的查询条件。

  • 与嵌入文档的元素匹配

elemMatch 查询条件 (quantity>2, quantity<=10) 将被翻译为 "quantity": { "$gt": 2, "$lte": 10 }。 这种语法更加简洁和表达。

-- Enter "elemem [Tab]", then...

SELECT * FROM survey WHERE "|" =elemMatch(product='abc', quantity>2, quantity<=10)

The equivalent MongoDB Query

db.survey.find({
  "|": {
    "$elemMatch": {
      "product": "abc",
      "quantity": {
        "$gt": 2,
        "$lte": 10
      }
    }
  }
})
  • 元素匹配
--  Enter "elem [Tab]", then...
SELECT * FROM survey WHERE "score" =elemMatch($gte=80, $lte=85)

The equivalent MongoDB Query

db.survey.find({
  "score": {
    "$elemMatch": {
      "$gte": 80,
      "$lte": 85
    }
  }
})

$all数组操作符选择字段值为包含所有指定元素的数组的文档。

--  Enter "all [Tab]", then...
SELECT * FROM survey WHERE "|" = toJS($all=['', ''])

存在检查和类型检查片段

  • 存在检查 ($exists)
--  Enter "exists [Tab]", then...
SELECT * FROM collection WHERE "|" =$exists(TRUE)

--  Enter "nonExist [Tab]", then...
SELECT * FROM collection WHERE "|" = $exists(FALSE)

--  Enter "existAndIsNull [Tab]", then...
SELECT * FROM collection WHERE "|" = $exists(TRUE) and "|" IS NULL

--  Enter "existAndIsNotNull [Tab]", then...
SELECT * FROM collection WHERE "|" = $exists(TRUE) and "|" IS NOT NULL
  • 按多种数据类型查询 ($type)
--  Enter "typeSearch [Tab]", then...
SELECT * FROM collection WHERE "|" = toJS($type=['double','int','string','bool','date','object','array','null'])

小技巧

如果你用的是免费版,禁止把翻译的Script来拷贝,该怎么办?!别着急,运行成功后,点击下面的"Console"标签就能看到所有的内容!入下图所示:
在这里插入图片描述
这样你就可以把翻译前后的内容拷贝粘贴了!


<<<<<<<<<<<< [完] >>>>>>>>>>>>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离线安装PostgreSQL数据库(v13.4版本)

记录&#xff1a;328 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;离线安装PostgreSQL数据库&#xff0c;版本&#xff1a;v13.4。主要是PostgreSQL的编译、安装、启动、登录、设置远程可登录、创建数据库、创建数据库用户等。 版本&#xff1a; 操作系统&#xff1…

转铁蛋白修饰硬脂酸/棕榈酸 TF-PEG-C18 Stearic Acid/C16, palmitic acid

产品名称&#xff1a;转铁蛋白-聚乙二醇-硬脂酸 英文名称&#xff1a;TF-PEG-C18 Stearic Acid 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、750、1k、2k…

G. Good Key, Bad Key(暴力)

Problem - 1703G - Codeforces 有n个箱子。第i个箱子里有ai个硬币。你需要按顺序打开所有n个箱子&#xff0c;从箱子1到箱子n。 你可以用两种类型的钥匙来打开箱子。 一把好钥匙&#xff0c;使用它需要花费k个硬币。 坏钥匙&#xff0c;不需要花费任何金币&#xff0c;但会将…

操作系统:进程的创建(fork函数)、进程的替换(exec函数)

文章目录1.进程的创建2.进程的替换3.进程的阻塞1.进程的创建 ①调用fork函数的进程为父进程&#xff0c;调用后生成一个子进程&#xff1b; ②创建子进程成功时&#xff0c;父进程中fork函数的返回值是子进程的进程号PID&#xff1b; ③创建子进程失败时&#xff0c;父进程中fo…

使用.NET简单实现一个Redis的高性能克隆版(一)

正文 我遇到了这个项目&#xff0c;它的目标是成为一个比Redis有着更好性能和更易用的克隆版。我发现它很有趣&#xff0c;因为它主要的卖点之一就是它是在多线程模式下运行&#xff08;而不是像Redis那样是单线程&#xff09;。他们使用memtier_benchmark&#xff08;Redis项…

shell命令以及运行原理

shell命令以及运行原理shell命令以及运行原理shell命令以及运行原理 Linux严格意义上来说说的是操作系统&#xff0c;我们把操作系统称之为“内核”&#xff08;kernel&#xff09;&#xff0c;但是我们用户是不会直接与kernel直接打交道的&#xff0c;我们是通过一个“外壳程…

D. Fixed Point Guessing(二分+交互式问题)

Problem - D - Codeforces 这是一个互动问题。 最初&#xff0c;有一个数组a[1,2,...,n]&#xff0c;其中n是一个奇数正整数。陪审团选择了n-12对不相干的元素&#xff0c;然后对这些元素进行交换。例如&#xff0c;如果a[1,2,3,4,5]&#xff0c;对1↔4和3↔5进行互换&#xf…

吐血经验,怎么把OAK相机的镜头模组拆下来?

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

[AI] LRTA*(K) 搜索算法

LRTA*[k]搜索算法 一、理论二、实际应用步骤一、理论 LRTA*(K) 是LRTA* 算法的进阶版&#xff0c;关于LRTA*的回顾请点此处&#xff0c; LRTA*(K) 论文请点此处 该文作者把LRTA算法归为 无界传播(unbounded propagation, 中文用谷歌翻译的。。。囧)&#xff0c;LRTA(K)归为有…

第四章:JVM运行时参数

一、JVM参数选项类型类型一&#xff1a;标准参数选项类型二&#xff1a;-X参数选项类型三&#xff1a; -XX参数选项二、常用的 JVM 参数选项打印设置的 XX 选项及值堆、栈、方法区的参数栈堆方法区垃圾回收器相关参数Serial回收器ParNew 回收器ParallelGcCMS回收器G1 回收器如何…

Win11杜比全景声无法正常运行的解决方法教学

Win11杜比全景声无法正常运行的解决方法教学。我们的电脑开启杜比声全景音效之后&#xff0c;无论是看电影&#xff0c;还是听音乐&#xff0c;都可以获得更加良好的视听体验。但是有用户却遇到了电脑无法正常的开启杜比声音效的问题&#xff0c;一起来看看如何去解决的方法吧。…

【Selenium】Selenium4 Grid

Selenium Grid: 将客户端发送的命令转发到远程浏览器上执行 WebDriver 脚本。 简介 Selenium Grid 是由一个 hub 服务和若干个 node 代理节点组成。 Hub 调度服务&#xff0c;管理各个代理节点的注册信息和状态信息&#xff0c;并且接收来自客户端代码的调用请求&#xff0c;…

13.练习题(年月日,打字游戏)

练习 1.任意给出一个年、月、日&#xff0c;判断是这一年的第几天&#xff1a;闰年算法&#xff1a;能被4整除且不能被100整除&#xff0c;或者能被400整除。 如&#xff1a;2012 5 10 是这一年的第131天。 提示&#xff1a;使用数组的方式计算&#xff0c;将每月的天数放在一…

面试学习总结

之前根据视频做的总结&#xff0c;备个份。 一、Volatile关键字 volatile是Java虚拟机提供的轻量级的同步机制。 三个特性&#xff1a; 保证可见性 线程修改了工作内存中的值并写回到主内存之后&#xff0c;主内存立刻通知所有线程。称为可见性。&#xff08;结合JMM理解&am…

蓝桥杯刷题(三)

蓝桥杯刷题一.等差素数列&#xff08;较难&#xff09;二.货物摆放&#xff08;思路新奇&#xff09;三.既约分数四.跳跃五.数值求值&#xff08;坑题&#xff09;蓝桥杯题库一.等差素数列&#xff08;较难&#xff09; 这道题有公式&#xff0c;其等差就是它长度内所有素数的乘…

Seata安装并注册集成到Nacos服务上

目录 一.工具地址与版本 二.解压与配置 三.创建数据库&#xff0c;执行脚本 四.启动与调试 五.seata高可用 六.查看启动情况 一.工具地址与版本 1.nacos-server-2.0.3 下载地址&#xff1a;Releases alibaba/nacos GitHub 2.seata-server-1.4.2 下载地址&#xff1…

小侃设计模式(十四)-职责链模式

1.概述 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是为请求创建了一个接收者对象的链&#xff0c;让请求沿着这条链进行传播&#xff0c;直到有对象处理它为止&#xff0c;它属于典型的行为型模式。这种方式降低了发送者和处理者之间的耦合关系&…

HTML+CSS简单的网页制作期末作业 关于我的家乡——四川文化网页介绍 DW大学生网页作业制作设计 Dreamweaver简单网页成品

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

chapter1——亚稳态的世界

目录1.亚稳态理论2.亚稳态窗口3.计算MTBF4.避免亚稳态多级同步器时钟倍频电路的多级同步器5.亚稳态测试电路6.同步器类型7.综合性建议在异步系统中&#xff0c;由于数据和时钟的关系不是固定的&#xff0c;因此有时会出现违反建立和保持时间的现象&#xff0c;此时便会输出介于…

OTA: Optimal Transport Assignment for Object Detection原理与代码解读

paper&#xff1a;OTA: Optimal Transport Assignment for Object Detection code&#xff1a;https://github.com/Megvii-BaseDetection/OTA 背景 标签分配&#xff08;Label Assignment&#xff09;是目标检测中重要的一环&#xff0c;经典的标签分配策略采用预定义的规则…