Какая библиотека Javascript может оценивать предикаты запросов, подобные MongoDB, в отношении объекта?

Есть ли библиотека javascript, которая позволит мне выражать предикаты объектов в DSL, аналогичном языку запросов MongoDB? Для большей ясности в большой программе я хотел бы сказать:

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

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

вместо того:

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

Я использую Node.js, поэтому все, что есть на NPM, было бы замечательно. Было бы дополнительным бонусом, если бы библиотека могла выбирать объекты из массива, а также просто сопоставлять отдельные объекты.

Я рассмотрел эти два связанных вопроса, но они не особо помогли в моей ситуации:


person RubyTuesdayDONO    schedule 13.03.2013    source источник


Ответы (5)


Хорошо, я нашел ответ: Sift.js

Теперь длинный ответ: это было спросил и ответил раньше. Основные моменты:

  • Используйте Sift, если вам действительно нужен синтаксис Mongo
  • Если вы хотите быть более популярным, используйте Underscore.js, как и все остальные. Он имеет множество удобных функций в дополнение к тому факту, что он в основном делает то, что делает sift, с немного другим синтаксисом.
  • Вам может вообще не понадобиться какая-либо библиотека - современные браузеры поддерживают множество полезных функций непосредственно на Прототип массива, например filter().

В заключение, mongodb-riff, похоже, пытается сделать что-то похожее, но в настоящее время страница четко заявляет, что это не работает - возможно, это заброшено. Но его readme по крайней мере представляет ценность :-), он упоминает sift и Query Engine, который выглядит более зрелый, хотя и слишком сложный для меня!

Лично я собираюсь использовать Underscore, потому что теперь, когда я впервые рассмотрел его, я понимаю, что в нем есть куча полезных вещей, которые мне нужны, плюс я действительно хотел выполнять только простые функции, такие как _.find() в Подчеркивать. Но я думаю, что если вы хотите выполнять более сложные запросы типа монго, вы сделаете это с меньшим LOC с Sift.

person Fletch    schedule 20.03.2013
comment
ну, я подумал, что там что-нибудь будет - а почему не на Github? Мне, наверное, следовало искать себя, но я надеялся, что кто-то другой уже наткнулся на это. посмотрим, сможешь ли ты украсть приз у @Vivin ^ _ ^! - person RubyTuesdayDONO; 20.03.2013
comment
классно! Sift.js выглядит правильным. мне нравится и я использую Underscore / Lodash, но необходимо повторно использовать предикаты, уже хранящиеся в Mongo. благодарю вас! - person RubyTuesdayDONO; 25.03.2013
comment
о, и спасибо, что нашли [исходный вопрос] (stackoverflow.com/questions/8695718]. Я искал, но не нашел » т найти ^ _ ^; - person RubyTuesdayDONO; 25.03.2013
comment
Также существует механизм запросов Balupton, который является многофункциональным и продуманным. - person alexandru.topliceanu; 24.04.2013

Ознакомьтесь с Mingo

Я реализовал его, не найдя подходящей альтернативы.

Он все еще активно развивается, но его можно использовать. Тестовое покрытие не полное.

Можно использовать как в браузере, так и в nodejs

[Редактировать]

Эта библиотека теперь является наиболее полной реализацией языка запросов MongoDB для внешнего интерфейса.

person kofrasa    schedule 22.10.2013
comment
И sift, и Mingo великолепны, но MSON переходит на Mingo, поскольку Mingo поддерживает агрегирование. - person redgeoff; 31.01.2021

Библиотека https://github.com/mirek/node-json-criteria делает именно это - оценивает запросы критериев для объектов JSON с использованием формата запроса MongoDB.

person Mirek Rusin    schedule 12.10.2014

lodash.js

Вы хотите использовать lodash.js. Это капля на замену underscore.js. Производительность в два раза быстрее.

http://lodash.com/

person Donny V.    schedule 08.08.2013

Ближайшее, что я смог найти, это linq.js, то есть LINQ для JavaScript. Надеюсь, это вам поможет.

person Vivin Paliath    schedule 13.03.2013
comment
Я не думаю, что это то, что я ищу - но это определенно не твоя вина! может еще никто ничего подобного не делал. я рассмотрю linq.js и посмотрю, поможет ли это вообще. спасибо, @Vivin! - person RubyTuesdayDONO; 14.03.2013