10
votes

Complexité du temps de $ addtoSet vs $ pousser lorsque l'élément n'existe pas dans le tableau

donnée: la connexion est sécurisée = TRUE de revenir de la mise à jour contiendra des informations de mise à jour.

Dites que j'ai un documents qui ressemblent à: p>

coll.update({'a': {'$ne': 1}}, {'$push': {'a':1}}, multi=True)


3 commentaires

Qu'entendez-vous par «Complexité du temps» Voulez-vous dire la quantité de temps prise par la comparaison par rapport à $ pousser ?


Oui. Si $ pousser avec un NE $ va courir à travers tous les éléments, que je suppose $ addtoset fait aussi. Lequel des deux est optimal à utiliser?


$ Poussez facilement, car même si $ poussez-vous doit retirer le tableau (sous-documentation), il n'est pas nécessaire de se comparer à se mettre.


3 Réponses :


2
votes

Edit

OK Depuis que je lis votre question de mal tout ce qui s'avère que vous regardez en fait deux requêtes différentes et en jugeant la complexité de temps entre eux.

La première requête étant: xxx

et le second étant: xxx

premier problème à l'esprit ici, aucun index. $ addtoset , étant un modificateur de mise à jour, je ne crois pas qu'il utilise un index en tant que tel, vous faites une analyse de table complète pour accomplir ce dont vous avez besoin.

En réalité, vous cherchez. Pour tous les documents qui n'ont pas 1 dans A déjà et cherchent à $ pousser la valeur 1 à ce < code> A tableau.

SO 2 Points à la deuxième requête, même avant d'entrer dans la complexité de temps ici parce que la première requête:

  • n'utilise pas d'index
  • serait une table complète de la table
  • ferait alors une balayage complet (sans index) sur $ addtoSet

    J'ai donc fait à peu près mon esprit ici que la deuxième requête est ce que vous recherchez avant l'une des grosses trucs de notation.

    Il y a un problème à utiliser Big O Notation d'expliquer la complexité de temps de chaque requête ici:

    • Je ne suis pas sûr de quelle perspective que vous souhaitez, que ce soit par document ou pour toute la collection.
    • Je ne suis pas sûr d'index comme tels. L'utilisation d'index créera en fait un algorithme de journal sur A mais pas utiliser index ne le fait pas.

      Cependant, la première requête ressemblerait à quelque chose comme: o (n) par document depuis:

      • Le $ addtoSet aurait besoin de itérer sur chaque élément
      • Le $ addtoSet aurait alors besoin de faire un O (1) OP pour insérer l'ensemble s'il n'existe pas. Je dois noter que je ne suis pas sûr si le O (1) est annulé ou non (Light Lecture suggère ma version), je l'ai annulée ici.

        par collection, sans l'indice, ce serait: o (2n2) car la complexité de l'itération A augmentera de manière expulité avec chaque nouveau document.

        Le Deuxième requête, sans index, ressemblerait à quelque chose comme: o (2n2) (O (n) par document) Je crois que depuis $ ne aurait les mêmes problèmes que $ addtoset sans index. Cependant, avec des index, je crois que cela serait effectivement O (log n journal) (O (log n) par document) car il trouverait d'abord tous les documents avec A dans tous les documents sans 1 dans leur ensemble sur la base de l'arbre B.

        ainsi basé sur la complexité du temps et les notes au début, je dirais que la requête 2 est meilleure.

        Si je suis Honnête, je ne suis pas habitué à expliquer dans la notation "Big O", donc c'est expérimental.

        espère qu'il aide,


8 commentaires

Eh bien, votre dernière ligne est ma question. Son ($ addtoset) vs ($ push + $ ne). Les deux travailleraient, mais si je devais les évaluer en termes de Big O, comment chaque score serait-il?


@ Meson10 Vous continuez à utiliser l'argot et je ne veux pas comprendre parce que je n'utilise pas le même argot que vous, quel est le "Big O"? De plus, j'édique que $ pousser est plus rapide pour "la complexité du temps".


En informatique, la complexité temporelle d'un algorithme quantifie la quantité de temps prise par un algorithme pour fonctionner en fonction de la taille de l'entrée au problème. La complexité de temps d'un algorithme est couramment exprimée à l'aide de la grosse notation, qui supprime des constantes multiplicatives et des termes inférieurs de l'ordre. Lorsqu'il est exprimé de cette façon, la complexité de temps est décrite asymptotiquement, c'est-à-dire que la taille d'entrée va à l'infini. Par exemple, si le temps requis par un algorithme sur toutes les entrées de taille N est au plus 5N3 + 3n, la complexité du temps asymptotique est O (N3) SMNR.ME/TNAP7N


@ Meson10 ok je ne suis pas habitué à battre autour de la brousse avec la syntaxe de mathématiques, mais je suis habitué à expliquer cela avec un anglais ordinaire, mais je après 50 minutes de lecture dans une grosse notation, pensez avoir pu traduire mon anglais en maths . Je vais éditer si je vois des erreurs.


Je pense que vous avez mal interprété ma question. Je ne comparais pas $ addtoset avec une poussée $ ne vs vs $. Je veux comparer $ addtoset vs ($ push + $ ne). Remarque: pensez-y, il n'y a pas de RED $ NE RECHERCHE pendant que je fais un $ addtoSet. Deuxièmement, la syntaxe «mathématiques» est un moyen plus standard de dénoter des métriques. Exemple: la voiture A est tellement plus rapide que B ou voiture A est 80kmph plus rapide que B :-)


@ meson10 ah j'ai été confus parce que vous avez montré la requête: col.update ({'a': {'$ ne': 1}}, {'$ addtoset': {'a': 1}}, multi = Vrai) C'est pourquoi j'ai donné cette réponse. Alors je pensais que c'était $ adtoset + $ ne pas vs $ ne + $ pousser


@ Meson10 Voulez-vous dire que vous voulez dire Big O notation par document Mise à jour atomique ou par mise à jour de la collecte, également à l'aide et non à l'utilisation d'index modifiera la grosse notation pour cela puisqu'il s'agirait d'un algorithme de journal sur $ NE mais pas sur $ addtoset qui signifie $ Addtoset est encore pire.


@ Meson10 Je ne suis pas sûr que c'est un bon exemple des différences depuis "plus rapide", est inutile, car un tel anglais était "80 km / h plus rapide". Je comparerais cela plus à dire en anglais clair que la voiture est de 80 km / h plus rapide et dans la notation de type Big O disant que O = T + 80 où T est égal à la vitesse de la voiture actuelle que vous mesurez. Bien sûr, la somme est en fait plus complexe que ça, mais vous voyez ce que je veux dire ...



17
votes

ressemble à $ addtoset fait la même chose que votre commande: $ appuyez sur un chèque de $ NE . Les deux seraient o (n)

https: // github. com / mongodb / mongo / blob / maître / src / mongo / dB / ops / update_internal.cpp

Si la vitesse est vraiment importante, pourquoi ne pas utiliser de hachage:

Au lieu de: xxx

Utilisation: xxx


1 commentaires

Hmm je dis addtoSet était O (n) pourtant je suis bownvoted ... il faut avoir tort



2
votes

Ajout de mon observation en différence entre AddtoSet et appuyez sur la mise à jour en vrac de documents 100K.

Lorsque vous faites la mise à jour en vrac. AddtoSet sera exécuté séparément. P>

Par exemple, P>

db.collection_name.count() #gives around 40k 

db.collection_name.count({"a":{$in:["b"]}}) # it gives only around 30k


0 commentaires