MongoDB独特的查询

时间:2018-02-05 14:17:17

标签: mongodb aggregate

我有一系列产品,其中一些产品具有相同的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将获取它们。

它工作正常,但它需要的时间是常规查询的两倍多。 有更好的方法吗?

谢谢!

1 个答案:

答案 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 ] } } }