2 votes

MongoDb : Conserver un tableau de longueur fixe dans un objet, avec une politique fifo et d'autres conditions ?

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.

  1. 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".

  1. 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 ).

  1. 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 .

8voto

Andrew Barrett Points 9848

Dans la version 2.3.2 de mongo une nouvelle fonctionnalité a été ajouté . Il existe maintenant un $slice qui peut être utilisé pour maintenir un tableau à une taille fixe.

Par exemple :

t.update( {_id:7}, { $push: { x: { $each: [ {a:{b:3}} ], $slice:-2, $sort: {'a.b':1} } } } )

2voto

Gates VP Points 26481

Il n'y a pas de moyen facile de le faire, mais c'est une bonne idée :

  1. Au lieu de traiter les éléments EXCEEDED dans les scripts, mettez un drapeau bool dans l'objet, et traitez-le en utilisant un scripts de nettoyage de données séparé.

L'exécution d'un script séparé a définitivement du sens pour cela.

MongoDB ne dispose pas d'une méthode pour les tableaux de longueur fixe. Mais il n'a certainement pas de méthode pour faire quelque chose comme ça :

choisir certains documents importants, en écarter d'autres moins importants, et se débarrasser de certains anciens documents

La seule exception que je ferais est le drapeau "bool". Vous voulez probablement un simple compteur. Si vous pouvez indexer sur ce compteur, il devrait être rapide de trouver les tableaux qui sont "trop grands".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X