MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $indexOfCP

Dans MongoDB, le $indexOfCP L'opérateur de pipeline d'agrégation recherche dans une chaîne une occurrence d'une sous-chaîne et renvoie l'index de point de code UTF de la première occurrence.

L'index de point de code UTF est basé sur zéro (c'est-à-dire qu'il commence à 0 ).

Syntaxe

La syntaxe ressemble à ceci :

{ $indexOfCP: [ <string expression>, <substring expression>, <start>, <end> ] } 

Où :

  • <string expression> est la chaîne à rechercher.
  • <substring expression> est la sous-chaîne que vous souhaitez rechercher dans la chaîne.
  • <start> est un argument facultatif qui spécifie une position d'index de départ pour la recherche. Il peut s'agir de n'importe quelle expression valide qui se résout en un nombre entier non négatif.
  • <end> est un argument facultatif qui spécifie une position d'index de fin pour la recherche. Il peut s'agir de n'importe quelle expression valide qui se résout en un nombre entier non négatif.

Si la valeur spécifiée n'est pas trouvée, $indexOfCP renvoie -1 .

S'il existe plusieurs instances de la valeur spécifiée, seule la première est renvoyée.

Exemple

Supposons que nous ayons une collection appelée test avec les documents suivants :

{ "_id" :1, "data" :"c 2021" }{ "_id" :2, "data" :"© 2021" }{ "_id" :3, "data" :"ไม้เมือง" } 

Voici un exemple d'application de $indexOfCP à ces documents :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "2021" ] }
          }
     }
   ]
) 

Résultat :

{ "data" :"c 2021", "result" :2 }{ "data" :"© 2021", "result" :2 }{ "data" :"ไม้เมือง", "result" :- 1 } 

Dans les deux premiers documents, la sous-chaîne a été trouvée à la position d'index de point de code UTF 2 . Étant donné $indexOfCP les résultats sont basés sur zéro (l'index commence à 0 ) la position 2 représente le troisième point de code.

C'est un résultat différent de ce que nous obtiendrions si nous utilisions $indexOfBytes , car le symbole de copyright (© ) dans le second document occupe 2 octets. Mais il utilise un seul point de code, qui est le même que ce que la lettre c utilise.

Concernant le troisième document, la sous-chaîne n'a pas été trouvée du tout, et le résultat est donc -1 .

Voici un autre exemple, sauf que cette fois nous recherchons un caractère thaï :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "เ" ] }
          }
     }
   ]
) 

Résultat :

{ "data" :"c 2021", "result" :-1 }{ "data" :"© 2021", "result" :-1 }{ "data" :"ไม้เมือง", "result" :3 }

Dans ce cas, nous avons recherché un caractère qui se trouve dans le troisième document, et son index de point de code UTF-8 revient sous la forme 3 . Étant donné $indexOfCP les résultats sont basés sur zéro, cela signifie qu'il s'agit du quatrième point de code.

Cela est dû au fait que le deuxième caractère a un signe diacritique, qui est également un point de code. Par conséquent, le premier caractère est un point de code et le deuxième caractère est deux points de code (y compris le diacritique), ce qui équivaut à trois. Cela signifie que notre caractère commence à la quatrième position (qui est le numéro de point de code 3 , en raison du nombre d'index commençant à 0 ).

Voir MongoDB $strLenCP pour un exemple qui renvoie le nombre de points de code pour chaque caractère dans cette chaîne particulière. Et voir MongoDB $strLenBytes pour voir le nombre d'octets dans la même chaîne.

Spécifiez une position de départ

Vous pouvez fournir un troisième argument pour spécifier une position d'index de départ pour la recherche.

Supposons que nous ayons le document suivant :

{ "_id" :4, "data" :"ABC XYZ ABC" }

Voici un exemple d'application de $indexOfCP avec une position de départ :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "ABC", 1 ] }
          }
     }
   ]
) 

Résultat :

{ "data" :"ABC XYZ ABC", "result" :8 }

Dans ce cas, la deuxième instance de la sous-chaîne a été renvoyée. C'est parce que nous avons commencé la recherche à la position 1 , et la première instance de la sous-chaîne commence à la position 0 (avant la position de départ de la recherche).

Si la position de début est un nombre supérieur à la chaîne ou supérieur à la position de fin, $indexOfCP renvoie -1 .

S'il s'agit d'un nombre négatif, $indexOfCP renvoie une erreur.

Spécifiez une position de fin

Vous pouvez également fournir un quatrième argument pour spécifier la position d'index de fin pour la recherche.

Si vous fournissez cet argument, vous devez également fournir une position de départ. Si vous ne le faites pas, cet argument sera interprété comme le point de départ.

Exemple :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "XYZ", 0, 3 ] }
          }
     }
   ]
) 

Résultat :

{ "data" :"ABC XYZ ABC", "result" :-1 }

Le résultat est -1 ce qui signifie que la sous-chaîne n'a pas été trouvée. C'est parce que nous avons commencé notre recherche à la position 0 et l'a terminé à la position 3 , donc ne capturant pas la sous-chaîne.

Voici ce qui se passe si nous incrémentons la position d'index de fin :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "XYZ", 0, 5 ] }
          }
     }
   ]
) 

Résultat :

{ "data" :"ABC XYZ ABC", "result" :4 }

Cette fois, la valeur a été incluse et sa position d'index a été renvoyée.

Si la position de fin est un nombre inférieur à la position de départ, $indexOfCP renvoie -1 .

S'il s'agit d'un nombre négatif, $indexOfCP renvoie une erreur.

Champs manquants

Si le champ n'est pas dans le document, $indexOfCP renvoie null .

Supposons que nous ayons le document suivant :

{ "_id" :5 }

Voici ce qui se passe lorsque nous appliquons $indexOfCP :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "XYZ" ] }
          }
     }
   ]
) 

Résultat :

{ "résultat" :nul }

Valeurs nulles

Si le premier argument est null , $indexOfCP renvoie null .

Supposons que nous ayons le document suivant :

{ "_id" :6, "data" :null }

Voici ce qui se passe lorsque nous appliquons $indexOfCP :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "XYZ" ] }
          }
     }
   ]
) 

Résultat :

{ "data" :null, "result" :null }

Cependant, lorsque le deuxième argument (c'est-à-dire la sous-chaîne) est null , une erreur est renvoyée :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", null ] }
          }
     }
   ]
) 

Résultat :

exception non détectée :erreur :échec de la commande :{ "ok" :0, "errmsg" :"$indexOfCP nécessite une chaîne comme deuxième argument, trouvé : null", "code" :40094, "codeName" :"Location40094 "} :l'agrégat a échoué :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(shell):1:1

Type de données incorrect

Si le premier argument est le mauvais type de données (c'est-à-dire qu'il ne se résout pas en chaîne), $indexOfCP renvoie une erreur.

Supposons que nous ayons le document suivant :

{ "_id" :7, "données" :123 }

Voici ce qui se passe lorsque nous appliquons $indexOfCP à ce document :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $indexOfCP: [ "$data", "XYZ" ] }
          }
     }
   ]
) 

Résultat :

exception non détectée :erreur :échec de la commande :{ "ok" :0, "errmsg" :"$indexOfCP nécessite une chaîne comme premier argument, trouvé :double", "code" :40093, "codeName" :"Location40093 "} :l'agrégat a échoué :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(shell):1:1

Comme l'indique le message d'erreur, $indexOfCP requires a string as the first argument .