J'ai quelques scripts qui mettent à jour, des enregistrements mongoDb qui ressemblent à ceci :
{ "_id" : "c12345", "arr" : [
{
"i" : 270099850,
"a" : 772,
},
{
"i" : 286855630,
"a" : 622,
}
] }
Les scripts ajoutent des éléments dans le tableau "arr" de l'objet, en utilisant "pushAll" qui fonctionne bien et est très rapide.
Mon exigence : 1. Continuez à modifier ces objets, mais traitez-les dès que la taille de arr dépasse 1000.
- Lorsque le nombre d'enregistrements dépasse 1000, je choisis certains enregistrements importants et j'en élimine d'autres moins importants, et j'élimine certains vieux enregistrements, et je réduis la taille de arr à 500 .
Mise en œuvre actuelle : 1. script A prend des données de quelque part et trouve l'objet dans une autre collection. en utilisant le champ "_id", et ajoute ces données dans le tableau "arr".
- Le même script, lorsqu'il trouve l'élément, vérifie la taille de "arr", si elle est inférieure à 1000, il effectue un ajout normal à arr, sinon il procède au traitement de l'objet PHP récupéré par find, le modifie, et met à jour l'enregistrement mongo en utilisant "SET".
Goulets d'étranglement actuels : 1. Je veux que la mise à jour du script soit très rapide. Les Upserts sont rapides, mais les opérations de recherche et de modification sont plus lentes pour chaque enregistrement.
Idées en tête : 1. Au lieu de traiter les éléments EXCEEDED dans les scripts, mettre un drapeau bool dans l'objet, et le traiter en utilisant un scripts séparé de Data Cleaner. ( mais cela me demande aussi de TROUVER l'objet avant de faire UPSERT ).
- Toujours maintenir une variable COUNT dans l'objet, qui stocke la longueur actuelle de "arr", et l'utiliser dans le Data cleaner script qui nettoie tous les objets récupérés par une requête mongodb requête "count" > 1000. ( Comme mongodb ne permet pas à l'opérateur $size d'avoir des Ranges, et seulement une condition égale actuellement, j'ai besoin d'avoir mon propre compteur COUNT)
Avez-vous d'autres idées propres et efficaces à proposer ? Merci .