J'ai une requête simple comme celle-ci: {"field": {$nin: ["value1","value2","valueN"]}}.

Le problème est une grande quantité de valeurs uniques à exclure (en utilisant l'opérateur $nin). Il s'agit d'environ 50000 valeurs uniques à filtrer et d'environ 1 Ko de longueur de requête.

Question : Existe-t-il un moyen élégant et performant de réaliser de telles opérations?

Exemple . Collection daily_stat avec 56M de documents. Chaque jour augmente la collection avec 100K documents. Exemple de document

{
    "day": "2020-04-15",
    "username": "uniq_name",
    "total": 12345
}

Je lance la requête suivante:

{
  "date": "2020-04-15",
  "username": {
    $nin: [
      "name1",
      "name2",
      "...",
      "name50000"
    ]
  }
}

Version MongoDB: 3.6.12

0
Spartak 16 avril 2020 à 01:16

2 réponses

Meilleure réponse

Je dirais que le grand tableau $nin est la solution élégante. S'il y a un index sur field, il sera également performant - mais seulement en termes d'exclusion rapide de ces documents à ne pas retourner dans le curseur. Si vous avez, disons, 10 millions de documents dans une collection et que vous faites un find() pour exclure 50000, vous faites toujours glisser 9 950 000 enregistrements hors de la base de données et à travers le fil; ce n'est pas anodin.

1
Buzz Moschetti 16 avril 2020 à 13:55

Si vous pouvez trouver un modèle dans les valeurs que vous transmettez, vous pouvez essayer avec regex. Exemple donné ci-dessous

db.persons.find({'field':{$nin:[/san/i]}},{_id:0,"field":1})

Plus de détails sur les regex dans

https://docs.mongodb.com/manual/reference/operator/query/regex/

0
upog 16 avril 2020 à 14:09