Mongoose:返回唯一的结果集,没有重复的条目

时间:2015-05-04 00:24:10

标签: node.js mongodb mongoose

我在MEAN环境中使用Mongoose。如何确保结果集中没有任何重复结果? 示例:我的数据库包含10个(部分重复)名称:

  • 阿伦
  • Allan Fourier
  • 阿伦
  • Allan Maxwell
  • 阿伦
  • Allan Foo
  • Allan Whatever
  • Allan Whoever
  • Allan Smith
  • Allan Rogers

查询此数据库以查找Allan'或者甚至只是“所有人”。 (使用.find(regex ...)并将返回的结果数限制为5,我得到了这个:

  • 阿伦
  • Allan Fourier
  • 阿伦
  • Allan Maxwell
  • 阿伦

有三个重复的“Allan&#39”条目,我们浪费了很多结果多样性(谈论搜索输入字段的自动完成功能)。我需要返回的结果集没有重复项,例如:

  • 阿伦
  • Allan Fourier
  • Allan Maxwell
  • Allan Foo
  • Allan Whatever

如果可以的话,怎样才能使用猫鼬?

3 个答案:

答案 0 :(得分:8)

您可以使用find建立查询,然后在生成的查询对象上链接对distinct的调用,以获取结果中的唯一名称:

var search = 'Allan';
Name.find({name: new RegExp(search)}).distinct('name').exec(function(err, names) {...});

或者您可以将它全部组合到模型上的distinct调用中,将查询对象作为第二个参数:

var search = 'Allan';
Name.distinct('name', {name: new RegExp(search)}, function(err, names) {...});

在这两种情况下,names都是一个只包含不同名称的数组,而不是完整的文档对象。

您也可以使用aggregate执行此操作,这样可以直接限制结果数量:

Name.aggregate([
    {$match: {name: new RegExp(search)}},
    {$group: {_id: '$name'}},
    {$limit: 5}
])

答案 1 :(得分:0)

您可以使用MongoDB的distinct()查询来查找集合中的不同值(即唯一值)。根据{{​​3}},distinct可以与Mongoose一起使用。

他们的例子:

{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] }
{ "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] }
{ "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": "S" }
{ "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }

db.inventory.distinct( "dept" )将返回[ "A", "B" ]

答案 2 :(得分:0)

您可以使用此处建议的方法过滤搜索结果:

Delete duplicate from Array