MongoDB独立查询
我有一个产品集合,其中一些产品具有相同的URL,我无法避免这些重复(数据库由第三方填充) 我试图提出一个高效的查询,只获取不同的产品(而不获取具有相同url的两个产品) 这就是我到目前为止的想法:MongoDB独立查询,mongodb,aggregate,Mongodb,Aggregate,我有一个产品集合,其中一些产品具有相同的URL,我无法避免这些重复(数据库由第三方填充) 我试图提出一个高效的查询,只获取不同的产品(而不获取具有相同url的两个产品) 这就是我到目前为止的想法: db.product.find({_id: {$in: db.product.aggregate([ { $match: { searchName: /iphone 8.*/i, isAvailable: true
db.product.find({_id: {$in:
db.product.aggregate([
{
$match: {
searchName: /iphone 8.*/i,
isAvailable: true
}
},
{
$group: {
_id: "$url",
id: {$max: "$_id"}
}
}
]).map(a => a.id)
}}).limit(10);
内部的aggregate
将返回不同产品的ID,外部的find
将获取它们
它工作正常,但所需时间是常规查询的两倍以上。
有更好的方法吗
谢谢 您正在进行两个查询-第一个查询获取
id
s,第二个查询通过id
s获取文档。您可以在一个管道中完美地结合这两个方面:
db.product.aggregate([
{ $sort: {_id: -1} },
{
$match: {
searchName: /iphone 8.*/i,
isAvailable: true
}
},
{
$group: {
_id: "$url",
docs: {$push: "$$ROOT"}
}
},
{ $replaceRoot: { newRoot: { $arrayElemAt: [ "$docs", 0 ] } } }
])
从v3.4开始提供。在旧版本中使用此阶段的解决方法可以是
{ $project: {_id: 0, product: { $arrayElemAt: [ "$docs", 0 ] } } }
此命令引发此错误:错误:命令失败:{“确定”:0,“errmsg”:“无法识别的管道阶段名称:'$replaceRoot'”,“代码”:16436}:聚合failed@AlexandreJustino,我为db的古老版本添加了一个变通方法,但我强烈建议升级。v3.0已经死了,而v3.2将在半年内结束。