Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB性能:$和vs.具有多个键的单个对象_Mongodb_Mongodb Query - Fatal编程技术网

MongoDB性能:$和vs.具有多个键的单个对象

MongoDB性能:$和vs.具有多个键的单个对象,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个对订单执行某些操作的内部服务,它有一个内置的必需过滤器,服务用户可以通过额外的过滤器 实现同一目标的两种方法: A) 使用$和: 异步函数getOrders({optionalFilter={}){ const baseFilter={amount:{$gt:10}; const mergedFilter={$and:[baseFilter,optionalFilter]}; 返回等待订单。查找(合并过滤器); } B) 在同一对象中合并所有对象 异步函数getOrders({opti

我有一个对订单执行某些操作的内部服务,它有一个内置的必需过滤器,服务用户可以通过额外的过滤器

实现同一目标的两种方法: A) 使用
$和

异步函数getOrders({optionalFilter={}){ const baseFilter={amount:{$gt:10}; const mergedFilter={$and:[baseFilter,optionalFilter]}; 返回等待订单。查找(合并过滤器); }
B) 在同一对象中合并所有对象

异步函数getOrders({optionalFilter={}){ const baseFilter={amount:{$gt:10}; const mergedFilter={…baseFilter,…optionalFilter}; 返回等待订单。查找(合并过滤器); }
我更喜欢第一种方法,因为它允许我在不覆盖
$gt:10
规则的情况下执行以下操作,而第二种方法将通过覆盖内部规则来破坏代码

getOrders({optionalFilter:{amount:{$lt:50}}});
我的问题是,选择一个比另一个有什么好处(性能或其他方面)

我的问题是,选择一个比另一个有什么好处(性能或其他方面)

  • 简短回答:否。如果您不使用(复合)索引

  • 长回答:好吧,让我们来测试一下,对吗

让我们来收集~100K文档和未索引数组字段:

  • {asset_class:“COMMDTY”}

  • 使用
    {$and:[{item_子类:“Herb”,资产类:“COMMDTY”}}

  • {item_子类:“Herb”,资产类:“COMMDTY”}

  • 好的,使用
    $和
    与不使用
    之间存在
    114ms
    差异。但这是否意味着停止使用
    $和
    ,并避免使用它?当然不是。但随着更多领域的增加,Mongo将变得越慢。但当我向查询中添加一个已经索引的字段时,整个情况发生了变化

    {扩展:“BFA”,资产类别:“COMMDTY”}

    因此,如果您通过
    mergedFilter
    添加更多字段,那么请确保您的索引(如果您正在使用它们)可以使用,因为对于复合索引字段,顺序非常有意义。因此,查询:
    {asset\u class:“COMMDTY”,扩展:“BFA”}
    将进入:

    如果我的回答有帮助,请您将其标记为已接受,或者至少对其投赞成票?