在MongoDB中迭代文档以获得字段的最小值还是使用聚合函数更好?

在MongoDB中迭代文档以获得字段的最小值还是使用聚合函数更好?,mongodb,Mongodb,假设我有一组物品 [ { 'item': ... , 'price' : ... } . . . ] 我需要所有包含“项目”:“A”的文件,以及所有此类项目的最低价格。因此,一般来说,如果项目“A”的此类文档的数量最多可以达到2000个,那么最好是通过迭代检索到的文档或使用mongodb中的聚合函数来找到最低价格(如果我使用aggregate,我基本上会对文档进行两次检查,一次使用.find({..}),一次使用.aggregate()

假设我有一组物品

[
   {
       'item': ... ,
       'price' : ...
   }
   .
   .
   .
]
我需要所有包含“项目”:“A”的文件,以及所有此类项目的最低价格。因此,一般来说,如果项目“A”的此类文档的数量最多可以达到2000个,那么最好是通过迭代检索到的文档或使用mongodb中的聚合函数来找到最低价格(如果我使用aggregate,我基本上会对文档进行两次检查,一次使用.find({..}),一次使用.aggregate().或者有没有一种方法可以将检索和获取最小值结合起来

编辑[添加解释] 例如,如果我有3个文档

[
   {
       'item': 'A' ,
       'price' : 30
   },
   {
       'item': 'B' ,
       'price' : 40
   },
   {
       'item': 'A' ,
       'price' : 20
   }
]
我希望输出类似于:

[
   {
       'item': 'A' ,
       'price' : 30
   },
   {
       'item': 'A' ,
       'price' : 20
   },
   'min_price' : 20
]

提前非常感谢。

这里有两种方法编写查询以获得最低
价格:

aggregationQuery =
   [ {
       $match : { item: 'A' }
     }
     {
       $group:
         {
           _id: "$item",
           minPrice: { $min: "$price" }
         }
     }
   ]
db.collection.aggregate(aggregationQuery)
(1)聚合:

聚合查询在服务器上运行,并将结果(最低价格)返回给客户端(运行查询的
mongo
shell)。这是一个操作的结果

db.collection.aggregate([
  $match: { item: 'A' },
  $group: { _id: null, min_price: { $min: "$price" } }
)
(2)效率不高的方法:

find
查询在服务器上运行,并将与查询筛选器
{item:'A'}
匹配的所有文档获取到客户端(
mongo
shell)。在shell中迭代(循环)查看返回的文档,找出哪个文档的最低价格。即多个操作-在服务器上进行查询,通过网络返回到客户端,并在客户端上进行处理

db.collection.find( { item: 'A' } )
             .toArray()
             .map(obj => obj.price)
             .reduce((acc, curr) => (acc < curr) ? acc : curr)

感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过说明这是一个很好的问题解决方案的原因,A将极大地提高其长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的答案中添加一些解释,包括您所做的假设。Ple请看一看我对@prasad_所写答案的评论。您使用聚合的第一种方法为我提供了与“项”:“a”相关的最低价格。但是,“我需要所有包含“项”:“a”的文档,以及所有此类项目的最低价格。”。我想打印相关文档以及最低价格。有没有办法将两者结合起来?我添加了一个聚合以获得最低价格的文档。我很抱歉没有在前面添加示例,我发现它造成了很多混乱。请查看添加的说明。非常感谢您的帮助!。
db.collection.aggregate( [
  { 
      $match: { item: "A" } 
  },
  { 
      $group: { 
          _id: null, 
         min_price: { $min: "$price" },
         docs: { $push: "$$ROOT" }
     } 
  },
  { 
      $project: { 
          docs: { 
             $filter: { input: "$docs", as: "doc", cond: { $eq: [ "$$doc.price", "$min_price" ] } } }
      }
  },
  { 
      $unwind: "$docs" 
  },
  { 
      $replaceRoot: { newRoot: "$docs" } 
  }
] ).pretty()