查找并返回非重复值

时间:2017-10-22 05:50:07

标签: node.js regex mongodb mongoose aggregation-framework

我有一个问题,我从昨天起就试图解决这个问题,我编写了一个接受城市/子城市名称的API,然后在数据库中查询城市或子城市匹配的所有文件。

我的问题是:

1)如果有4个文件,其中3个文件有城市作为孟买,1个文件有城市作为Navi Mumbai,当我查询孟买时,我应该只得到2个文件,其中一个文件'城市是孟买和另一个文件'城市是Navi Mumbai但是我没有那样工作,而是获得了所有4份文件作为回报,我获得了3个文件,其中有城市作为孟买,1个文件有城市作为Navi Mumbai。我想知道如何消除重复的结果,只返回没有重复键的文档,只返回一个文档而不重复键值

目前我的代码如下:

exports.get_startup_based_on_locaton = function(req, res) {
    SSchema.find({ $or:[{'city': { $regex : new RegExp(req.params.location, "i")}}, {'subcity': { $regex : new RegExp(req.params.location, "i")}}]}, function(err, sschema) {
    if (err)
    res.send(err);
    res.json(sschema);
  })
}

1 个答案:

答案 0 :(得分:1)

你想要.aggregate()。这是"群组"和.find()没有'分组的唯一内容:

exports.get_startup_based_on_locaton = function(req, res) {
    SSchema.aggregate([
      { $match: { 
        $or:[
          {'city': { $regex : new RegExp(req.params.location, "i")}},
          {'subcity': { $regex : new RegExp(req.params.location, "i")}}
        ]
      }},
      { $project: { combined: ['$city','$subcity'] } },
      { $unwind: '$combined' },
      { $match: { combined: { $regex : new RegExp(req.params.location, "i")} } },
      { $group: { _id: '$combined' } }
    ], function(err, sschema) {
      if (err)
      res.send(err);
      res.json(sschema);
    })
}

在两个字段中搜索后,将它们与匹配的文档中的$project一起显示。然后你$unwind形成的数组并仅过滤匹配的条目。

最后$group会发出" unique"匹配的条目。