Il existe quelques alternatives:
1. Remplacez les points par un tiret.
Ce serait mon approche préférée, car elle maintient la structure suffisamment explicite.
Puisque selon vous, «c'est à peu près une insertion unique», il devrait être relativement simple de vérifier s'il ne casse rien (c'est-à-dire qu'il y a déjà une même clé avec un tiret). Pour d'autres situations, effectuer ces vérifications par programme nécessite d'écrire du code, mais reste une tâche relativement facile.
Je déconseille fortement cette approche, car elle entraînerait des maux de tête de débogage massifs sur la route . Laisser quelqu'un qui utilise le JSON résultant quelque part dans le code loin de MongoDB deviner qu'un point n'est pas vraiment un point est un bon moyen de perdre littéralement des semaines de temps. Gardez ces astuces Unicode pour les pirates qui veulent inciter quelqu'un à penser qu'un personnage est différent.
3. Utilisez BSON.
Dans la mesure où vous prétendez que vous "récupéreriez principalement le document entier plutôt que d'en interroger des parties", cette approche n'a pas d'inconvénients majeurs dans votre cas . Bien que vous ayez dit «principalement», ce qui signifie que parfois, vous ne récupérerez que des parties du document.
En général, l'inconvénient est que vous ne pourrez pas rechercher dans le document ou en charger seulement une partie.
4. Utilisez un encodage standard, tel que Base64.
La conversion des clés problématiques (ou de toutes les clés, selon le rapport entre celles problématiques et non problématiques) en Base64 ou hexadécimal pourrait être une solution viable, avec l'avantage d'être plutôt explicite: la plupart des développeurs reconnaîtraient les valeurs Base64 ou hexadécimales en un coup d'œil .
L'inconvénient est l'empreinte mémoire accrue, ainsi que la nécessité d'encoder et de décoder les clés lors de leur utilisation.
Je déconseille fortement cette approche, car cela rendrait la requête de données ambiguë et gaspillerait des heures ou des jours à essayer de comprendre pourquoi une requête spécifique ne fait pas ce que vous imaginiez qu'elle devrait faire. Le point est un caractère réservé et le chèque est là pour vous protéger; en disant à MongoDB de sauter la vérification, vous ne reporterez que le moment où vous devrez faire face à un conflit entre la syntaxe de MongoDB et le caractère réservé utilisé dans une clé.