在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()