【问题标题】:Why do MongoDB queries use $gt and $lte instead of > and <=?为什么 MongoDB 查询使用 $gt 和 $lte 而不是 > 和 <=?
【发布时间】:2011-05-31 12:06:21
【问题描述】:

我是 MongoDB 新手。它似乎是建立在 JavaScript 语法之上的。为什么不能使用&lt;&gt;= 等更清晰的比较运算符来代替$gt$lte

来自在线 shell 的示例:

db.scores.find({a: {'$gte': 2, '$lte': 4}});

【问题讨论】:

    标签: javascript mongodb comparison operators


    【解决方案1】:

    我的猜测是他们觉得你经常会忘记引号并写{a: {&gt;: 2}}。在 JavaScript 和其他一些语言中,在编写 $gte 时省略引号是完全可以的(例如,{a: {$gte: 2, $lte: 4}} 有效,{"a": {"$gte": 2, "$lte": 4}} 也是如此。当您在 Mongo 中尝试查询时,这可以节省大量输入外壳。

    我不确定您是否在问这个问题,但让我来解决为什么查询语言看起来不像 SQL 的问题,例如为什么我们不能将查询写为a &gt;= 2 &amp;&amp; a &lt;= 4$where 查询除外)。这样做的原因是运行该查询的唯一方法是解析 JavaScript 并为每个文档运行。使用索引是不可能的,并且每个文档都必须从存储在磁盘上的 BSON 数据转换为内存中的 JavaScript 对象(顺便说一下,当您执行 $where 查询时会发生这种情况,一组或地图减少)。

    使用 JSON/BSON 表示法进行查询的优雅之处在于它们是纯数据,可以在客户端和服务器端进行操作和分析。在服务器上,查询永远不会通过 JavaScript 解释器,而是被提供给查询计划器,后者将其分离、制定计划并执行它。在客户端,查询可以使用客户端语言自己的数据结构构建,并且只有在传递到服务器时才能转换为通用表示(即 BSON)。

    【讨论】:

    • 我理解解析和 JSON 推理,缺少引号是一个实际的考虑。除了良好的 JSON 支持之外,JavaScript 是询问 NoSQL 引擎的最佳选择吗? (尽管这可能需要一个单独的问题)
    • 我认为这是一个单独的问题,但很有趣。 JavaScript 在 NoSQL 数据库中非常常见(MongoDB、CouchDB 和 Riak 都可以执行 JavaScript),而 JSON/BSON 是一种更为广泛的数据交换格式。很明显,XML 在同一领域失败了,但还有其他替代品,如 Protobuf、Thrift 和 Avro。我们暂时不要把 SQL 排除在外,像 RediSQL 这样的混合体已经将 SQL 带回了 NoSQL。
    【解决方案2】:

    它允许将 MongoDB 代码嵌入 HTML 或 XML 文档中,而不必与实体(&amp;lt;&amp;gt;)或 CDATA 混淆。

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 2016-12-23
      • 2021-12-29
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多