Tous les produits
Search
Centre de documentation

:Modifications de compatibilité dans MongoDB 3.6

Dernière mise à jour :Aug 08, 2026

Cette rubrique décrit les modifications de compatibilité introduites dans MongoDB 3.6.

Pour plus d'informations sur les modifications officielles de compatibilité de MongoDB, consultez le site web MongoDB.

Modifications de compatibilité liées à la liaison localhost

À partir de MongoDB 3.6, les binaires mongod et mongos sont liés à localhost par défaut. Si le paramètre net.ipv6 est défini dans le fichier de configuration ou si la prise en charge d'IPv6 est activée via l'option de ligne de commande --ipv6, ces binaires sont liés à l'adresse IPv6 de localhost.

Depuis MongoDB 2.6, seuls les binaires issus des packages RPM officiels de MongoDB (pour Red Hat, CentOS, Fedora Linux et leurs dérivés) et des packages DEB (pour Debian, Ubuntu et leurs dérivés) sont liés à localhost par défaut.

Lorsqu'ils sont liés uniquement à localhost, les binaires de MongoDB 3.6 n'acceptent que les connexions provenant de clients situés sur la même machine (y compris le shell mongo, les membres des réplicas sets ou les nœuds des sharded clusters). Les clients distants ne peuvent pas se connecter aux binaires liés uniquement à localhost.

Pour outrepasser ce comportement par défaut et lier les binaires à d'autres adresses IP, utilisez le paramètre net.bindIp dans le fichier de configuration ou l'option de ligne de commande --bind_ip pour spécifier une liste de noms d'hôte ou d'adresses IP.

Important

Avant de lier le serveur à une adresse autre que localhost (comme une adresse IP accessible publiquement), assurez-vous d'avoir sécurisé votre cluster contre tout accès non autorisé. Pour sécuriser votre cluster, activez l'authentification et renforcez votre infrastructure réseau.

Par exemple, l'instance mongod suivante est liée à localhost et au nom d'hôte My-Example-Associated-Hostname. Ce nom d'hôte est associé à l'adresse IP 198.51.100.1.

mongod --bind_ip localhost,My-Example-Associated-Hostname

Pour se connecter à cette instance, les clients distants doivent spécifier le nom d'hôte ou son adresse IP associée, 198.51.100.1.

mongo --host My-Example-Associated-Hostname

mongo --host 198.51.100.1

Instances de sharded cluster

À partir de MongoDB 3.6, les shards doivent utiliser l'architecture de replica set. Pour mettre à niveau une instance de sharded cluster vers MongoDB 3.6, tous les serveurs de shard doivent fonctionner en tant que replica sets.

API HTTP et API REST

À partir de MongoDB 3.6, MongoDB supprime l'API HTTP et l'API REST.

Configuration

Option mongod/mongos

net.http.enabled

httpinterface

net.http.JSONPEnabled

nohttpinterface

net.http.port

jsonp

net.http.RESTInterfaceEnabled

rest

Mises à jour des outils

MongoDB 3.6 supprime l'outil mongooplog.

Modifications de compatibilité des opérations sur les tableaux

Modifications du comportement de $type: "array"

À partir de MongoDB 3.6, les expressions type: "array" et $type: 4 correspondent aux champs de type tableau contenant des éléments de n'importe quel type.

Avant MongoDB 3.6, $type: "array" ne correspondait qu'aux champs de type tableau contenant des tableaux imbriqués.

Par exemple, une collection nommée c contient les documents suivants :

{ "_id": 1, "a": [ 1, 2, 3 ] },
{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

L'opération suivante interroge les données selon le type du champ a :

db.c.find( { "a": { $type : "array" } } )

À partir de MongoDB 3.6, une requête $type renvoie les deux documents de la collection, car la requête détecte désormais que le champ a est un tableau.

{ "_id": 1, "a": [ 1, 2, 3 ] },
{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

Avant MongoDB 3.4, une requête $type ne renvoyait que les documents dont le champ a contenait des éléments de type tableau BSON.

{ "_id": 2, "a": [ 1, 2, [ 3, 4 ] ] }

Si votre instance actuelle exécute MongoDB 3.4.x et que vous utilisez des index partiels dont l'expression partialFilterExpression contient $type: "array" ou $type: 4, vous devez reconstruire ces index après la mise à niveau vers MongoDB 3.6 afin d'éviter les conflits dus aux changements sémantiques de $type: 'array'.

Modifications du comportement de tri des tableaux

À partir de MongoDB 3.6, lors du tri sur un champ de type tableau, MongoDB utilise l'élément du tableau ayant la valeur la plus faible pour une clé de tri ascendante et l'élément ayant la valeur la plus élevée pour une clé de tri descendante. Le tri ne tient plus compte des prédicats de requête lors de la sélection d'un élément de tableau comme clé de tri. Cette modification de comportement s'applique à la commande find et aux opérations du pipeline d'agrégation.

Par conséquent, les applications effectuant des tris sur un champ de type tableau peuvent renvoyer des résultats de tri différents.

Remarque

Suite à d'autres ajustements du comportement de tri par un champ de type tableau dans MongoDB 4.4, lorsque vous effectuez un tri sur un champ de tableau avec un index multikey, un plan de requête inclut une étape de tri bloquante, sauf si :

  • Les limites d'index de tous les champs de tri sont [MinKey, MaxKey].

  • Aucune limite pour un champ indexé multikey n'a le même préfixe de chemin que le modèle de tri.

Modifications du comportement de tri de la méthode find

Dans MongoDB, une clé de tri est un élément de tableau que MongoDB utilise pendant le processus de tri pour comparer les documents comportant des champs de type tableau. Lors d'un tri ascendant, les documents contenant des tableaux avec les clés de tri de valeur la plus faible sont classés en premier. Lors d'un tri descendant, les documents contenant des tableaux avec les clés de tri de valeur la plus élevée sont classés en premier.

Différences de comportement de tri entre les versions :

  • Avant MongoDB 3.4 : un tri sur un champ de type tableau prend en compte les prédicats de requête lors de la détermination de sa clé de tri.

  • À partir de MongoDB 3.6 : un tri sur un champ de type tableau ne tient plus compte des prédicats de requête lors de la détermination de sa clé de tri. La clé de tri est plutôt l'élément de valeur la plus faible ou la plus élevée du tableau.

Si votre application, mise à niveau vers MongoDB 3.6, effectue des tris sur un champ de type tableau et utilise des prédicats de requête, vous devez vérifier si la logique de tri est affectée par cette modification de comportement et adapter votre code pour assurer la compatibilité.

Exemple :

Supposons qu'une collection nommée coll contienne les documents suivants :

{ _id: 0, a: [-3, -2, 2, 3] }
{ _id: 1, a: [ 5, -4 ] }

Exécutez une opération de requête et de tri pour le champ de tableau a :

db.coll.find({a: {$gte: 0}}).sort({a: 1});
  • Dans MongoDB 3.6, la clé de tri est l'élément de valeur la plus faible du tableau (sans tenir compte des prédicats de requête) :

    • L'élément de valeur la plus faible du tableau a pour le document avec _id: 0 est -3.

    • L'élément de valeur la plus faible du tableau a pour le document avec _id: 1 est -4.

    Le résultat suivant est renvoyé dans l'ordre croissant :

    { "_id" : 1, "a" : [ 5, -4 ] }
    { "_id" : 0, "a" : [ -3, -2, 2, 3 ] }
  • Avant MongoDB 3.4, la clé de tri est l'élément de valeur la plus faible correspondant au prédicat de requête {$gte: 0} :

    • Les éléments correspondants pour le document avec _id: 0 sont [2, 3], et l'élément de valeur la plus faible « 2 » est utilisé comme clé de tri pour le document.

    • L'élément correspondant pour le document avec _id: 1 est [5], et l'élément de valeur la plus faible « 5 » est utilisé comme clé de tri pour le document.

    Le résultat suivant est renvoyé dans l'ordre croissant :

    { _id: 0, a: [-3, -2, 2, 3] }
    { _id: 1, a: [ 5, -4 ] }

Modifications du comportement de tri de la méthode d'agrégation

À partir de MongoDB 3.6, lorsque vous utilisez db.collection.aggregate() pour effectuer un tri sur un champ de type tableau, un seul élément du tableau est utilisé comme clé de tri.

Exemple :

// Documents.
{ "_id" : 1, "timestamps" : [ ISODate("2017-07-15T15:31:01Z"), ISODate("2017-07-21T18:31:01Z") ] }
{ "_id" : 0, "timestamps" : [ ISODate("2017-07-21T15:31:01Z"), ISODate("2017-07-21T13:31:01Z") ] }

// Query.
db.c.aggregate([{$sort: {timestamps: -1}}])

Dans MongoDB 3.6 :

  • Pour un tri descendant, l'heure la plus récente du tableau est utilisée comme clé de tri :

    • 15 h 31 le 21 juillet pour le document avec _id: 0, et

    • 17 h 31 le 21 juillet pour le document avec _id: 1.

  • Le tri est effectué dans l'ordre décroissant. Par conséquent, ces clés sont ordonnées de la plus récente à la moins récente, ce qui place le document avec _id: 1 avant le document avec _id: 0.

Avant MongoDB 3.6, le tableau entier était utilisé comme clé de tri pour les tris d'agrégation. Les clés de tri de type tableau étaient comparées élément par élément pour déterminer l'ordre de tri d'un jeu de résultats.

// Documents.
{_id: 0, a: [3, 1, 5]}
{_id: 1, a: [3, 4, 0]}

// Query.
db.coll.aggregate([{$sort: {a: 1}}])

Avant MongoDB 3.6, les clés de tri étaient respectivement [3,1,5] et [3,4,0].

  • Les premiers éléments des deux clés sont identiques (3). Ensuite, les seconds éléments des tableaux sont comparés (1 < 4).

  • Par conséquent, le document avec _id: 0 est trié avant le document avec _id: 1.

Limites de tri composé sur plusieurs champs de type tableau dans le pipeline d'agrégation

À partir de MongoDB 3.6, lors d'un tri dans un pipeline d'agrégation, MongoDB ne peut plus trier les documents contenant des tableaux parallèles dans les champs de tri. Les tableaux sont considérés comme parallèles s'ils sont des éléments frères de l'objet BSON. Les tableaux ne sont pas considérés comme parallèles dans les situations suivantes :

  • Les clés de tri contiennent des tableaux imbriqués, tels que des chemins de champ avec des relations hiérarchiques.

  • Les clés de tri partagent le même tableau comme préfixe de chemin.

Remarque

Ces limites ont toujours existé pour la commande find. Toutefois, find et aggregate partagent la même sémantique dans MongoDB 3.6 et les versions ultérieures.

  • Exemple 1 : Un tri aboutit si un tableau imbriqué existe.

    Une collection contient les documents suivants :

    {a: [ {b: [1, 2]}, {b: [3, 4]} ]}

    Exécutez l'opération d'agrégation suivante (la clé de tri est un champ de tableau imbriqué) :

    db.coll.aggregate([{$sort: {"a.b": 1}}])

    L'opération réussit car a.b est un champ de tableau imbriqué et ne constitue pas des tableaux parallèles.

  • Exemple 2 : Un tri aboutit si les clés de tri partagent le même tableau comme préfixe.

    Une collection contient les documents suivants :

    {a: [{b: 1, c: 1}, {b: 2, c: 2}]}

    Exécutez l'opération d'agrégation suivante (les clés de tri partagent le même tableau comme préfixe) :

    db.coll.aggregate([{$sort: {"a.b": 1, "a.c": 1}}])

    L'opération réussit car a.b et a.c partagent le préfixe a et ne sont pas considérés comme des tableaux parallèles.

  • Exemple 3 : Des clés de tri frères entraînent l'échec du tri.

    Une collection contient les documents suivants :

    { _id: 1, a: [ 1, 2 ], b: [ 1, 2 ]}
    { _id: 2, a: [ -3, 5 ], b: 0 }
    { _id: 3, a: [ -6, 12 ], b: 100 }

    Exécutez l'opération d'agrégation suivante (les clés de tri sont des champs de tableau frères) :

    db.coll.aggregate([ { $sort: {a: 1, b: 1} } ])

    MongoDB ne peut pas effectuer de tri sur les champs a et b simultanément, car ce sont des tableaux frères et constituent des tableaux parallèles dans le document avec _id: 1. Pour effectuer un tri composé sur plusieurs champs de type tableau, assurez-vous que les champs de tri sont des tableaux imbriqués ou partagent le même tableau comme préfixe, et évitez d'utiliser des types de tableau dans des champs frères dans votre modèle de données.

Mises à jour des opérations de mise à jour

Mises à jour des nouveaux champs

À partir de MongoDB 3.6, les champs ajoutés lors des opérations de mise à jour sont ajoutés dans l'ordre lexicographique.

Par exemple, une collection nommée coll contient le document suivant :

{ _id: 0, x: 0 }

Exécutez une opération de mise à jour pour ajouter les champs suivants :

db.coll.update({_id: 0}, {$set: {b: 0, a: 0}})

Dans MongoDB 3.6, les nouveaux champs sont ajoutés dans l'ordre lexicographique. Par conséquent, le document mis à jour est {_id: 0, x: 0, a: 0, b: 0}.

Avant MongoDB 3.6, les nouveaux champs étaient ajoutés dans l'ordre de leur apparition dans le document de mise à jour. Par conséquent, le document mis à jour était {_id: 0, x: 0, b: 0, a: 0}.

Champs en conflit avec la syntaxe d'identifiant arrayFilters

À partir de MongoDB 3.6, les champs dont le nom entre en conflit avec la syntaxe d'identifiant arrayFilters (telle que $[]) ne peuvent plus être mis à jour.

Par exemple, une collection nommée coll contient le document suivant :

{ _id: 0, x: { "$[]": 0 } }

Exécutez une opération de mise à jour :

db.coll.update({_id: 0}, {$set: {"x.$[]": 1}})

À partir de MongoDB 3.6, une opération de mise à jour échoue car le nom du champ $[] entre en conflit avec la syntaxe d'identifiant arrayFilters.

Remarque

Ce nouveau comportement de mise à jour s'applique uniquement lorsque featureCompatibilityVersion est défini sur 3.6.

Validation plus stricte de l'opérateur $pop

À partir de MongoDB 3.6, les paramètres de l'opérateur $pop doivent être définis sur l'une des valeurs suivantes :

  • -1 : supprime le premier élément d'un tableau, ou

  • 1 : supprime le dernier élément d'un tableau.

Avant MongoDB 3.6 :

  • Les nombres négatifs permettaient de supprimer le premier élément d'un tableau, ou

  • Les nombres non négatifs ou les valeurs non numériques permettaient de supprimer le dernier élément d'un tableau.

Suppression de l'opérateur $pushAll

MongoDB 3.6 supprime l'opérateur $pushAll (obsolète depuis MongoDB 2.4).

Utilisez plutôt les opérateurs $push et $each. Exemple :

db.students.update(
   { name: "joe" },
   { $push: { scores: { $each: [ 90, 92, 85 ] } } }
)

Modifications de la prise en charge des plates-formes

  • MongoDB 3.6 ne prend plus en charge les versions Windows antérieures à Windows Server 2008 R2 et Windows 7.

  • MongoDB 3.6 n'est pas testé sur APFS, le nouveau système de fichiers de macOS 10.13+, et peut rencontrer des problèmes de compatibilité.

Mises à jour générales de compatibilité

Obsolescence du mécanisme d'authentification MongoDB-CR

À partir de MongoDB 3.6, MongoDB déclare obsolète le mécanisme d'authentification MONGODB-CR. Si ce n'est pas déjà fait, mettez à niveau votre schéma d'authentification MONGODB-CR vers SCRAM.

Nœuds arbitres et leur priorité

Tous les nœuds arbitres ont une priorité fixe de 0.

Obsolescence de l'architecture de réplication maître-esclave

MongoDB 3.6 déclare officiellement obsolète l'architecture de réplication maître-esclave.

Obsolescence de l'option --nojournal pour le moteur de stockage WiredTiger

MongoDB 3.6 déclare obsolète l'option --nojournal pour les membres de replica set utilisant le moteur de stockage WiredTiger, afin d'éviter les risques liés aux données.

Ajustements de la commande aggregate et de sa sortie

À partir de MongoDB 3.6, la commande aggregate ne renvoie plus les résultats sous forme d'un seul document.

Lors de l'exécution de la commande aggregate, vous devez spécifier l'une des options suivantes :

  • cursor : renvoie les résultats sous forme de curseur (adapté aux grands ensembles de données).

  • explain : renvoie une analyse du plan d'exécution d'un pipeline d'agrégation.

Nous vous recommandons d'utiliser db.collection.aggregate() dans le shell mongo ou la méthode équivalente dans votre pilote. Ces méthodes renvoient un curseur par défaut, sauf si l'option explain est utilisée.

Modifications de la conversion des champs de date en chaînes dans les expressions d'agrégation

À partir de MongoDB 3.6, MongoDB convertit systématiquement une date en une chaîne contenant une précision en millisecondes et se terminant par la lettre 'Z' (indiquant le fuseau horaire UTC) dans une expression d'agrégation.

Exemple :

// Documents.
{_id: 0, d: ISODate("2017-10-18T20:04:27.978Z")}
{_id: 1, d: ISODate("2017-10-18T20:04:28.192Z")}

// Query.
db.coll.aggregate({$project: {d: {$toLower: "$d"}}})

Avant MongoDB 3.6, les champs de données des deux documents étaient renvoyés sous forme de chaînes au format "2017-10-18t20:04:27" et "2017-10-18t20:04:28".

À partir de MongoDB 3.6, les champs de données des deux documents sont renvoyés sous forme de chaînes au format "2017-10-18t20:04:27.978z" et "2017-10-18t20:04:28.192z" (incluant les millisecondes et la lettre 'z' en minuscule).

Les modifications s'appliquent aux opérateurs d'agrégation suivants :

  • $concat

  • $substr

  • $substrBytes

  • $substrCP

  • $strcasecmp

  • $toLower

  • $toUpper

Suppression des commandes et options de diagnostic des journaux

MongoDB 3.6 supprime les options obsolètes diagLogging et mongod --diaglog.

Utilisez plutôt l'outil mongoreplay pour capturer, rejouer et analyser les commandes envoyées à votre déploiement MongoDB.

Modifications de l'opération validate

À partir de MongoDB 3.6, une opération validate déclenche systématiquement un point de contrôle et vide toutes les données en mémoire sur le disque uniquement avant d'exécuter une validation des données sur le disque.

Avant MongoDB 3.6, un point de contrôle était systématiquement déclenché, quel que soit le mode de validation utilisé.

Lorsque vous utilisez la commande validate ou la méthode db.collection.validate(), spécifiez explicitement {full: true} pour effectuer une validation complète.

Limites des noms d'index

À partir de MongoDB 3.6 :

  • Vous ne pouvez pas spécifier * comme nom d'index lors de la création d'un index.

  • Vous ne pouvez pas utiliser les clés d'index pour supprimer les index nommés *. Utilisez plutôt le nom d'index * pour supprimer les index.

Avant la mise à niveau vers MongoDB 3.6, vous devez :

  • Supprimer les index : supprimez manuellement tous les index existants nommés *.

  • Renommer les index : pour conserver les index, supprimez-les et recréez-les avec de nouveaux noms.

Options obsolètes

Modifications dans MongoDB 3.6.1 :

  • Obsolescence de l'option de requête snapshot.

    • Moteur de stockage MMAPv1 : utilisez plutôt hint({ _id: 1 }) pour garantir que les documents ne sont pas renvoyés plusieurs fois lors d'une requête, même si des écritures intermédiaires provoquent le déplacement des documents.

    • Autres moteurs de stockage (tels que WiredTiger) : utilisez plutôt hint({ $natural: 1 }).

  • Obsolescence de l'opérateur $isolated.

    • Alternative : utilisez des transactions ou ajustez les niveaux de read concern pour obtenir l'isolation.

Fonctionnalités incompatibles avec les versions ultérieures

Les nouvelles fonctionnalités suivantes de MongoDB 3.6 nécessitent que featureCompatibilityVersion soit défini sur « 3.6 » :

  • UUID pour les collections : chaque collection possède un identifiant unique.

  • Validation de document $jsonSchema : prend en charge la validation de la structure d'un document au format JSON Schema.

  • Change Streams : surveille les événements de modification de données en temps réel.

  • Secondaires sensibles aux chunks : optimise la synchronisation des données sur les nœuds secondaires dans une instance de sharded cluster.

  • Définitions de vues, validateur de documents et filtre d'index partiel : si vous utilisez les nouvelles fonctionnalités de requête de MongoDB 3.6, vous devez activer cette configuration.

  • Sessions et écritures retryables : prend en charge les sessions de transaction et la nouvelle tentative automatique des opérations d'écriture.

  • Restrictions d'authentification pour les utilisateurs et les rôles : gère les autorisations des utilisateurs de manière granulaire.

Valeurs par défaut de featureCompatibilityVersion :

  • Nouveaux déploiements de MongoDB 3.6 : "3.6".

  • Déploiements mis à niveau depuis MongoDB 3.4 : "3.4" (nécessite l'utilisation de setFeatureCompatibilityVersion).

Vous pouvez utiliser la commande db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) pour afficher la valeur actuelle de featureCompatibilityVersion.

Pour revenir à une version antérieure à MongoDB 3.6, vous devez supprimer toutes les données incompatibles, y compris les données persistantes liées aux sessions, aux change streams et aux UUID pour les collections.