【问题标题】:What Javascript library can evaluate MongoDB-like query predicates against an object?什么 Javascript 库可以针对对象评估类似 MongoDB 的查询谓词?
【发布时间】:2013-03-02 02:48:35
【问题描述】:

是否有一个 javascript 库可以让我在类似于 MongoDB 查询语言的 DSL 中表达对象谓词?为了在大型程序中清晰起见,我想说:

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 上的任何内容都会很棒。如果库可以从数组中选择对象以及匹配单个对象,那将是一个额外的好处。

我回顾了这两个相关的问题,但它们对我的情况并不是特别有帮助:

【问题讨论】:

标签: javascript node.js mongodb predicate


【解决方案1】:

好的,我找到了答案:Sift.js

现在是长答案:这是asked and answered before。重点是:

  • 如果你真的想要 Mongo 语法,请使用 Sift
  • 如果您想更主流,请像其他人一样使用Underscore.js。除了它基本上可以实现 sift 的功能之外,它还有许多方便的功能,但语法略有不同。
  • 您可能根本不需要任何库 - 现代浏览器直接在 Array prototype 上支持许多有用的功能,例如 filter()

最后一点,mongodb-riff 似乎正在尝试做类似的事情,但目前该页面明确指出它不起作用 - 也许它已被放弃。但是他的自述文件至少是有价值的 :-),他提到了 sift 和 Query Engine 看起来更成熟,虽然对我来说太复杂了!

就我个人而言,我将使用 Underscore,因为现在我第一次研究它,我意识到它有很多我需要的方便的东西,而且我真的只想做一些简单的功能,比如在下划线中为_.find()。但我想如果你想做更复杂的类似 mongo 的查询,你会用 Sift 在更少的 LOC 中完成。

【讨论】:

  • 好吧,我想会有一些东西 - 为什么不在 Github 上?我可能应该自己寻找,但我希望其他人已经遇到过它。让我们看看你能不能从@Vivin 那里偷到奖品^_^!
  • 太棒了! Sift.js 看起来恰到好处。我喜欢并使用Underscore/Lodash,但需要重新使用已经存储在 Mongo 中的谓词。谢谢!
  • 哦,感谢您找到[原始问题](stackoverflow.com/questions/8695718]。我搜索但没有找到^_^;
  • 还有balupton的query-engine,功能丰富且成熟。
【解决方案2】:

查看Mingo

我在找不到合适的替代方案后实施了它。

它仍在积极开发中,但可以使用。测试覆盖不完整。

浏览器和nodejs都可以使用

[编辑]

这个库现在是 MongoDB 前端查询语言最完整的实现。

【讨论】:

  • sift 和 Mingo 都很棒,但 MSON 正在切换到 Mingo,因为 Mingo 支持聚合。
【解决方案3】:

https://github.com/mirek/node-json-criteria 库正是这样做的 - 使用 MongoDB 查询格式评估对 JSON 对象的条件查询。

【讨论】:

    【解决方案4】:

    lodash.js

    您想使用 lodash.js。它是 underscore.js 的替代品。 性能提升一倍。

    http://lodash.com/

    【讨论】:

      【解决方案5】:

      我能找到的最接近的是linq.js,它是用于 JavaScript 的 LINQ。希望这对您有所帮助。

      【讨论】:

      • 我认为这不是我要找的东西——但这绝对不是你的错!也许还没有人做过这样的事情。我会考虑linq.js 看看它是否有帮助。谢谢你,@Vivin!
      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      相关资源
      最近更新 更多