2013-03-13 24 views
16

Czy istnieje biblioteka javascript, która pozwoli mi na wyrażanie predykatów obiektów w DSL, podobnie jak w języku zapytań MongoDB? Dla jasności w dużym programie, chciałbym móc powiedzieć:Jaka biblioteka JavaScript może oceniać predykaty zapytań podobnych do MongoDB względem obiektu?

var obj = { 
    a: 1, 
    b: 'abcdefg' 
}, qry = { 
    a: { $gt: 0 }, 
    b: /^abc/ 
}; 

if(query(qry).matches(obj)) { 
    // do something appropriate since 
} 

zamiast:

var obj = { 
    a: 1, 
    b: 'abcdefg' 
}; 
if(obj.a>0 && qry.b.test(obj.b)) { 
    // do something appropriate 
} 

Używam node.js, więc cokolwiek by na NPM być wspaniałym. Byłaby to dodatkowa premia, gdyby biblioteka mogła wybierać obiekty z tablicy, a także tylko dopasowywać pojedyncze obiekty.

Sprawdziliśmy te dwa inne pytania, ale nie były one szczególnie pomocne dla mojej sytuacji:

+0

Możliwy duplikat [Czy istnieje sposób na użycie obiektów zapytań MongoDB do filtrowania zwykłych tablic JavaScript?] (Http://stackoverflow.com/questions/8695718/is-there-a-way-to-use-mongodb- query-objects-to-filter-regular-javascript-arrays) –

Odpowiedz

16

OK znalazłem odpowiedź: Sift.js

Teraz na dłuższą odpowiedź: To był asked and answered before. Najistotniejsze punkty to:

  • Używaj przesiać jeśli naprawdę chcesz Mongo składni
  • Jeśli chcesz być bardziej powszechne, należy Underscore.js jak każdy inny. Ma mnóstwo praktycznych funkcji, oprócz tego, że w zasadzie robi to, co robi przesiew z nieco inną składnią.
  • Może nie potrzebujesz żadnej biblioteki - nowoczesne przeglądarki obsługują wiele przydatnych funkcji bezpośrednio na Array prototype, na przykład filter().

Na koniec, mongodb-riff wydaje się próbować zrobić coś podobnego, ale obecnie strona wyraźnie stwierdza, że ​​nie działa - być może jest porzucona. Ale jego readme jest co najmniej wartościowe :-), wspomina o przesiewaczu i Query Engine, który wygląda na bardziej dojrzały, choć dla mnie zbyt skomplikowany!

Osobiście mam zamiar pójść z Underscore, ponieważ teraz, gdy zagłębiałem się w to po raz pierwszy, zdaję sobie sprawę, że ma mnóstwo poręcznych rzeczy, których potrzebuję, a ja naprawdę chciałem tylko wykonywać proste funkcje, takie jak byłby _.find() w podkreśleniu. Ale myślę, że jeśli chcesz robić bardziej skomplikowane zapytania podobne do mongo, zrobisz to w mniej LOC z Sift.

+0

cóż, pomyślałem, że coś będzie - i dlaczego nie na Github? prawdopodobnie powinienem był sam się przekonać, ale miałem nadzieję, że ktoś inny już to zauważył. Zobaczmy, czy możesz ukraść nagrodę z @Vivin^_ ^! – RubyTuesdayDONO

+1

niesamowite! [Sift.js] (https://github.com/crcn/sift.js) wygląda dobrze. lubię i używam [podkreślenia] (http://underscorejs.org/)/[Lodash] (http://lodash.com/), ale muszę ponownie użyć predykatów już zapisanych w Mongo. Dziękuję Ci! – RubyTuesdayDONO

+1

oh, i dziękuję za znalezienie [pierwotne pytanie] (http://stackoverflow.com/questions/8695718). Szukałem, ale go nie znalazłem^_ ^; – RubyTuesdayDONO

0

Najbliższy mogłyby znaleźć był linq.js, który jest LINQ dla JavaScript. Mam nadzieję, że będzie to dla ciebie pomocne.

+1

Nie sądzę, że to jest to, czego szukam - ale to zdecydowanie nie twoja wina! być może nikt jeszcze nie zrobił czegoś takiego. Rozważę [linq.js] (http://linqjs.codeplex.com/) i zobaczę, czy to w ogóle pomaga. dziękuję, @Vivin! – RubyTuesdayDONO

1

lodash.js

Chcesz użyć lodash.js. Jest to zamień na zastąpienie pliku underscore.js. Wydajność jest dwa razy szybsza.

http://lodash.com/

6

Wyjazd Mingo

I wdrożone go po znalezieniu bez odpowiedniej alternatywy.

Jest nadal aktywnie rozwijany, ale nadaje się do użytku. Pokrycie testowe nie jest kompletne.

użytkowa zarówno przeglądarki i nodejs

[Edytuj]

Biblioteka ta jest obecnie najbardziej kompletne wdrożenie języka zapytań MongoDB za frontend.

2

biblioteka dokładnie to robi - ocenia zapytania o kryteria na obiektach JSON przy użyciu formatu zapytań MongoDB.