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

Mongo donne une erreur de clé en double sur le champ _id_ dans l'application Meteor

Cela ne résoudra pas votre problème, mais cela devrait vous orienter dans la bonne direction et peut-être vous permettre d'isoler le problème que vous pourrez utiliser pour créer une nouvelle question :

Il n'y en a pas. Il n'y a qu'un seul index, et il a un nom et un descripteur de clé. Ce n'est pas la même chose. Le nom de l'index par défaut est _id_ , sa clé est _id .

Le _id est normalement créé côté client, pas côté serveur. La question est de savoir d'où viennent ces clés, car 2ZGvRfuD8iMvRiXJd n'est certainement pas un ObjectId . Cela peut être une clé météore, ou vous utilisez une clé primaire personnalisée, mais je ne sais pas comment ces clés sont générées. Peut-être que ce qui génère la clé est susceptible de collisions ?

Plus d'informations à ce sujet seraient utiles, mais je suggérerais de formuler une nouvelle question afin qu'elle ne devienne pas trop longue ou qu'elle n'ait pas beaucoup d'historique.

C'est un lemme de la première réponse :vous ne pouvez pas supprimer l'index de clé primaire obligatoire.

Modifier :

Meteor, par défaut, génère des identifiants d'une manière différente de MongoDb . Cela a du sens, car la convention pour ObjectId rend les collisions probables si le nombre de clients est important (c'est-à-dire si les clients ne sont pas des instances de serveur, mais des navigateurs clients, dont il y a probablement 2 à 3 ordres de grandeur de plus).

Au lieu de cela, Meteor utilise apparemment la méthode pour générer systématiquement des nombres pseudo-aléatoires sur le client et le serveur . De manière irritante, l'implémentation utilise un PRNG et revient à un non générateur de nombres aléatoires déterministes crypto-forts (Alea) . En d'autres termes, découvrir comment exactement la génération de vos identifiants peut être délicate car cela dépend de nombreux détails de votre environnement.

Solution :essayez d'utiliser ObjectId comme clé primaire :

Orders= new Meteor.Collection('Orders', {idGeneration: 'MONGO'});