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 lettrec
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 position0
(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 position0
et l'a terminé à la position3
, 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
renvoienull
.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
renvoienull
.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:1Type 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:1Comme l'indique le message d'erreur,
$indexOfCP requires a string as the first argument
.