MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Функцията на javascript от страната на сървъра има ли проблеми с производителността в mongoDB?

Когато питате за жизнеспособността на javascript от страна на сървъра, първо трябва да изясните за какъв вид javascript от страна на сървъра говорите. Според документацията , има четири различни вида изпълнение на код от страна на сървъра. За съжаление всички те са един вид хакерски заобиколни решения за ситуации, в които естественият API е недостатъчен:

eval команда

eval има недостатъка, че работи само на един възел. Това значително намалява неговата полезност в клъстерна среда. С шардинг колекции изобщо не работи!

По подразбиране той също така създава глобално заключване, което прави базата данни напълно неизползваема, докато скриптът не се изпълни. Това може да се предотврати с nolock аргумент (освен ако самият скрипт не направи нещо, което създава глобално заключване).

Отговорът на Sammaye също обяснява някои сериозни опасения за сигурността.

Това наистина е повече инструмент за тестване и администриране, отколкото нещо, което трябва да използвате за редовни операции.

Стартиране на .js файлове чрез инстанция на mongo shell на сървъра

В този случай кодът не се изпълнява в базата данни, а по-скоро в друг независим процес на един от сървърите. Това означава, че всички необходими данни от други шардове трябва да бъдат прехвърлени към сървъра, който изпълнява javascript кода, без значение какво всъщност се връща от скрипта.

Показва се като друго приложение към сървъра на mongodb, така че не може да прави нищо, което вие също не бихте могли да направите от вашето обикновено приложение. Това е още един инструмент за тестване и администриране, който не трябва да използвате при нормална работа.

Намерете с $where -оператор

Операторът $where в команда за намиране позволява предаване на функция на javascript, която се използва за филтриране на стойности. За повечето тривиални случаи това е много по-малко ефективно от това, което могат да предложат другите инструменти на заявката за намиране, особено защото не може да използва никакви индекси.

Когато използването на $where не може да бъде избегнато, опитайте поне да използвате някои от нормалните инструменти на заявката за намиране, за да намалите набора от документи, които трябва да бъдат предадени на функцията $where.

MapReduce

MapReduce използва две javascript функции за създаване на обобщени данни. Преди това беше основният инструмент за извличане на данни за MongoDB, но повечето от обичайните му случаи на употреба сега се изпълняват от много по-удобния за потребителя рамка за агрегиране .

Освен това има същия недостатък като $where:освен ако не филтрирате, ще трябва да стартирате не една, а поне две функции на javascript за всеки документ.

Но MapReduce може поне да работи разпределено и може да бъде паралелизиран.

tl;dr:

Използването на Javascript е крайна мярка за много необичайни заявки, които не могат да бъдат направени с нормалния език за заявки и изискват достъп до твърде много данни, за да бъдат внедрени в приложението. Когато е възможно, направете това, което искате, със специализираните инструменти, които имате на разположение, или внедрите вашата логика на приложния слой.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Множество броя с една заявка в mongodb

  2. Предпочитания за четене на Mongodb

  3. Как да търсите подмасиви в MongoDB

  4. docker mongo за единичен (само основен възел) комплект реплики (за разработка)?

  5. Няма сървър, избран от WritableServerSelector от клъстер