MongoDB独立查询

MongoDB独立查询,mongodb,aggregate,Mongodb,Aggregate,我有一个产品集合,其中一些产品具有相同的URL,我无法避免这些重复(数据库由第三方填充) 我试图提出一个高效的查询,只获取不同的产品(而不获取具有相同url的两个产品) 这就是我到目前为止的想法: db.product.find({_id: {$in: db.product.aggregate([ { $match: { searchName: /iphone 8.*/i, isAvailable: true

我有一个产品集合,其中一些产品具有相同的URL,我无法避免这些重复(数据库由第三方填充)

我试图提出一个高效的查询,只获取不同的产品(而不获取具有相同url的两个产品)

这就是我到目前为止的想法:

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将在半年内结束。