MatchExpression(1): 查询操作符

 MatchExpression 是查询过程的第一步, 它是由一个Bson生成的, 根据bson的的各种设定, 产生一个树
 型的expression结构, 该树形结构中的节点是有一个个的查询操作符。 理解和掌握Mongodb里面第一的操作
 符的类型和属性, 是掌握MatchExpression的关键。

比较查询操作符

相等 $eq

syntax: {field: {$eq: xxx}}

  • xxx 是一个具体的值, 等价于: {field:xxx}
  • xxx 是一个array的某一个elem [xxx]: 等价于: {field:xxx};
  • xxx 是一个 array [xxx, yyy],需要完全匹配, 顺序和K/v;
大于 gt gte

syntax :
{field: { $gt: xxx } };

{field: {$gte: xxx}};

包含于 $in

syntax:
{ field: { $in: [value1, value2, … valueN ] } }

找到文档包含value1,value2,… valueN 中的其中一个;
这里的值可以是正则表达式, 但是不能包含$regex 操作符;

小于 lt lte

syntax : {field: {$lt: xxx}}

syntax : {field: {$lte: xxx}}

不等于 $ne

Syntax: {field: {$ne: value} }
- 文档的field不等于value;
- 文档不包含field;

不包含在 $nin

Syntax: { field: { $nin: [ value1, value2 … valueN ]} }
- field 的值不等于value1, … valueN;
- 文档不包含field

逻辑查询操作符

逻辑与 $and

Syntax: { $and: [ { expression1 }, { expression2 } , … , { expressionN } ] }

  • 文档必须同时满足 expression1, expression2, … expressionN;
  • 除了显式的, 还有隐含的$and 用法;
逻辑或 $or

Syntax: { $or: [ { expression1 }, { expression2 }, … , { expressionN } ] }

  • 如果所有的 orexpressionindex or 使用index;
  • 如果 or text, 所有的sub-expression必须支持索引;
  • 如果要判断某个field在某个集合内, 尽量使用$in;
逻辑非 $not

Syntax: { field: { $not: { operator-expression } } }

  • $not 必须和其他的操作符一起使用;
  • not regex一起使用
逻辑异或 $nor

Syntax : { $nor: [ { expression1 }, { expression2 }, … { expressionN } ] }

Element query operators

是否存在 $exists

Syntax: { field: { $exists: boolean } }

过滤类型 $type

Syntax: { field: { $type: BSON type number | String alias } }
- bson 支持的类型

TypeNumberAliasNotes
Double1“double”
String2“string”
Object3“object”
Array4“array”
Binary data5“binData”
Undefined6“undefined”Deprecated.
ObjectId7“objectId”
Boolean8“bool”
Date9“date”
Null10“null”
Regular Expression11“regex”
DBPointer12“dbPointer”Deprecated.
JavaScript13“javascript”
Symbol14“symbol”Deprecated.
JavaScript (with scope)15“javascriptWithScope”
32-bit integer16“int”
Timestamp17“timestamp”
64-bit integer18“long”
Decimal12819“decimal”New in version 3.4.
Minkey-1“minKey”
Maxkey127“maxKey”

evaluate query operators

取模 $mod

Syntax: { field: { $mod: [ divisor, remainder ] } }

  • divisor: 除数, reminder:余数;
  • 该操作符必须有两个参数;
正则表达式 $regex
  • Syntax:
    { : { regex:/pattern/, options: ‘’ } }
    { : { regex:pattern, options: ‘’ } }
    { : { $regex: /pattern/ } }
    等价于: { : /pattern/ }

  • 不能再 in使 regex;

  • options:
    i: case-insensitive;
    m: 当pattern内有‘^’ or ‘$’, 或者有换行的时候, 可以匹配多行的内容;
    x: 忽略pattern内的空白字符;
    s: 允许‘.’匹配所有的字符,包含换行符;
文本过滤 $text
  • Syntax:
{
  $text:
    {
      $search: <string>,
      $language: <string>,
      $caseSensitive: <boolean>,
      $diacriticSensitive: <boolean>
    }
}
  • FTS 专门用到文本过滤, 这里先搁置
$where

Syntax: {$where : “Javascript line or func”}

  • javascript line or func 不能使用全局变量;
  • $where 里面的语句不能使用index;

Geospatial Query Operators

没有研究过, 跳过

Array Query Operators

$all

Syntax: { field: { $all: [ value1 , value2 … ] } }

  • 包含全部的value1, … valueN;
  • 可以用$and 表示;
  • 可以与$elemMatch 一起用
$elemMatch

Syntax: { field: { $elemMatch: { query1, query2, … } } }

  • 找到文档包含array至少有一个element匹配所有的query;
  • 如果只有一个query, 这个操作符不是必要的;
  • query不能包含操作符$where;
$size

Syntax: { field: { $size: NUM} }

  • 找到所有的文档包含array, 他与NUM个elements;

Bitwise Query Operators

bitsAllClear/ bitsAllSet
  • Syntax:

    { field: { $bitsAllClear: numeric_bitmask } };

    { field: { $bitsAllClear: BinData bitmask } };

    { field: { $bitsAllClear: [ position1, position2, … ] } };

  • 找到文档其在指定的bit都是0(clear)或者1(set);

bitsAnyClear/ bitsAnySet
  • Syntax:

    { field: { $bitsAnyClear: numeric bitmask } }

    { field: { $bitsAnyClear: BinData bitmask } }

    { field: { $bitsAnyClear: [ position1, position2, … ] } }

  • bitsAllClear bitsAllSet 的区别: 任何一个指定的位是0, 就满足条件;

$comment

Syntax: { query, $comment: comment }

  • 为查询添加comment;

projection operators

$(projection)
  • Syntax:
db.collection.find( { <array>: <value> ... },
                    { "<array>.$": 1 } )
db.collection.find( { <array.field>: <value> ...},
                    { "<array>.$": 1 } )
  • 匹配文档的第一个位置的值, 其他的不要;
  • 如果匹配的是一个array, 就显示array的第一个element;
$elemMatch (projection)
  • syntax
    { query, { field: { $elemMatch: { sub_query1, subquery2, …, sub_queryN } }

  • 匹配所有满足sub_query的文档, 如果一个数组有N 个element, 其中有2个满足sub_query, 就只需要打印这两个elements;

$meta
  • syntax: { $meta: “textScore” }
$slice
  • Syntax:

    { array: {$slice: limit } }

    { array: {$slice: [skip, limit] } }

  • 整数代表从头计算, 负数表示从后向前;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将 StatefulSet 转换为 Deployment 的 YML 文件需要考虑以下几个方面: 1. StatefulSet 会为每个 Pod 分配唯一的名称,而 Deployment 只会为整个 ReplicaSet 分配唯一的名称。 2. StatefulSet 可以保证 Pod 的名称和网络标识符的稳定性,而 Deployment 不会保证这些稳定性。 因此,在将 StatefulSet 转换为 Deployment 的 YML 文件时,需要注意以下几点: 1. 将 `kind` 字段从 `StatefulSet` 改为 `Deployment`。 2. 删除 `spec.volumeClaimTemplates` 字段,因为 Deployment 不支持这个字段。 3. 将 `spec.selector.matchLabels` 字段改为 `spec.selector.matchExpressions`,并设置一个 `key` 为 `statefulset.kubernetes.io/pod-name` 的 `matchExpression`。 4. 将 `spec.template.metadata.labels` 字段中的 `statefulset.kubernetes.io/pod-name` 删掉,因为 Deployment 不需要保证 Pod 的名称的稳定性。 5. 将 `spec.template.spec.hostname` 和 `spec.template.spec.subdomain` 字段删掉,因为 Deployment 不需要保证 Pod 的网络标识符的稳定性。 下面是一个示例的 StatefulSet 转换为 Deployment 的 YML 文件: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchExpressions: - key: statefulset.kubernetes.io/pod-name operator: Exists template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 ``` 请注意,这个示例只是一个简单的转换示例,实际情况可能更为复杂,需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值