Je dois avoir des champs clés avec un '.' en eux. Y a-t-il un moyen de le faire? (Je ne parviens pas à les encoder)Comment stockez-vous les clés dans Mongodb avec un '.' dans eux
Répondre
De la MongoDB docs "the '.' le caractère ne doit apparaître nulle part dans le nom de la clé ". Il semble que vous deviez trouver un système d'encodage ou vous en passer.
Pour PHP, je remplace la valeur HTML de la période. C'est "."
.
Il stocke dans MongoDB comme ceci:
"validations" : {
"4e25adbb1b0a55400e030000" : {
"associate" : "true"
},
"4e25adb11b0a55400e010000" : {
"associate" : "true"
}
}
et le code PHP ...
$entry = array('associate' => $associate);
$data = array('$set' => array('validations.' . str_replace(".", `"."`, $validation) => $entry));
$newstatus = $collection->update($key, $data, $options);
Vous aurez besoin pour échapper aux clés. Comme il semble que la plupart des gens ne savent pas comment échapper correctement les chaînes, voici les étapes à suivre:
- Choisissez un caractère d'échappement (mieux vaut choisir un caractère rarement utilisé). Par exemple. Pour échapper, remplacez d'abord toutes les instances du caractère d'échappement par une séquence précédée de votre caractère d'échappement (par exemple '~' -> '~ t'), puis remplacez le caractère ou la séquence dont vous avez besoin Séquence précédée de votre caractère d'échappement. Par exemple. '.' Pour annuler l'annulation, supprimez d'abord la séquence d'échappement de toutes les instances de votre seconde séquence d'échappement (par exemple '~ p' -> '.'), puis transformez votre séquence de caractères d'échappement en un seul caractère d'échappement (par exemple, « ~ l » -> « ~ »)
aussi, rappelez-vous que mongo ne permet pas les clés de commencer par « $ », donc vous devez faire quelque chose de similaire il
est ici un code ça marche:
// returns an escaped mongo key
exports.escape = function(key) {
return key.replace(/~/g, '~s')
.replace(/\./g, '~p')
.replace(/^\$/g, '~d')
}
// returns an unescaped mongo key
exports.unescape = function(escapedKey) {
return escapedKey.replace(/^~d/g, '$')
.replace(/~p/g, '.')
.replace(/~s/g, '~')
}
Cet échappement peut toujours se casser, si vous avez des chaînes comme '. ~ P.'. Ici, la chaîne échappée sera '~ p ~~ p ~ p'. Unescaping vous donnera '. ~ ..', ce qui est différent de la chaîne actuelle. – jvc
@jvc Vous avez raison! J'ai corrigé l'explication et l'exemple des fonctions d'échappement. Faites-moi savoir si elles sont encore cassées! –
Voici quelques bonnes solutions - http://stackoverflow.com/questions/12 397118/mongodb-dot-in-key-name –