我有一系列产品,其中一些产品具有相同的URL,我无法避免重复这些产品(数据库由第三方填充)。
我正在尝试提出一个有效的查询来仅获取不同的产品(不会获得具有相同网址的两个产品)。
这是我到目前为止所提出的:
onOpen()
内部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);
将返回不同产品的ID,外部aggregate
将获取它们。
它工作正常,但它需要的时间是常规查询的两倍多。 有更好的方法吗?
谢谢!
答案 0 :(得分:1)
您正在进行2次查询 - 第一次查询id
,第二次查询id
来获取文档。您可以将它们完美地组合在一个管道中:
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起,$replaceRoot可用。在旧版本中使用此阶段的解决方法可能是
{ $project: {_id: 0, product: { $arrayElemAt: [ "$docs", 0 ] } } }