Ensemble de valeurs sans ordre particulier

Pour une contrainte d'unicité avec des listes

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je travaille avec MongoDB et mes documents ont cette forme :

1
2
3
4
5
6
7
{
    '_id': ObjectId(),
    'type': ObjectId(), # Fait référence au champ de la table analysistypes
    'parents': [ObjectId(), ObjectId()...],
    'settings': {},
    'data': {}
}

Je souhaiterais qu'aucun document n'ait à la fois :

  • le même type
  • les mêmes parents
  • les mêmes paramètres

qu'un autre.

Seulement, l'ordre des parents n'importe pas. C'est-à-dire que [a, b, c] et [a, c, b] sont considérés comme identiques au niveau de la contrainte d'unicité.

Puis-je gérer cela sans devoir parcourir mon tableau des parents à chaque fois ? Existerait-il un type set, ne tenant pas compte de l'ordre des éléments ?

Merci !

Edit : je peux vérifier à l'insertion les informations que je souhaite avec $all, mais peut-être Mongo l'implémente-t-il nativement ?

+0 -0

Ouep, mais suis-je obligé de faire la fonction suivante ou puis-je directement créer un index sur ma collection correspondant à mes besoins ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def exist(type_, parents, settings):
    data = mongo.db.analysis.find({
        'type': type_,
        'settings': settings,
        'parents': {
            '$all': parents
        }
    })

    return bool(data)
+0 -0

Je viens de remarquer que $all ne convenait pas à mon besoin :

The $all operator selects the documents where the value of a field is an array that contains all the specified elements.

Je souhaiterais plutôt savoir si le tableau contient exactement mes éléments, peu importe dans quel ordre. Une astuce serait de regarder s'il les contient et quelle est sa taille. Mais peut-être existe-t-il une option toute faite ?

Merci !

+0 -0

Une solution consiste à trier le tableau avant de l'insérer avec la clé parents. Lors de la comparaison, il suffit de trier le tableau à comparer avec la valeur parents et de tester la simple égalité.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte