mongodb:如何为具有相同属性值的每个组过滤一个文档?

时间:2015-12-19 18:33:08

标签: javascript node.js mongodb filter mongoose

我有一个像这样的mongodb集合结构:

var personSchema = new mongoose.Schema({
  _id: ObjectId,
  name: String,
  // ...
  alias: String
};

(我使用猫鼬,但这是次要的)。

由于我从不同的来源获取人员,一些文档可以引用同一个人:在这种情况下,我想让两个人都在数据库中,并为他们分配一个(唯一的)别名。

目前,当我需要进行查询以单独列出人员时,我会检索所有人,然后过滤掉别名,只保留其中一个(我不关心哪一个),在javascript中(当然我需要保持 no 别名的人。像这样:

Person.find({}, null, function(err, persons) {
  var result = [];
  var aliases = [];
  for (var i = 0; i < persons.length; i++) {
    if (persons[i].alias && aliases.hasOwnProperty(persons[i].alias))
      continue;  // skip this person because it's alias was seen already
    result.push(persons[i]); // add this person to result
    if (persons[i].alias) // add this person alias to seen aliases
      aliases[persons[i].alias] = true;
  }
});

由于这很慢,当人数增长时,我想在mongo查询中过滤掉重复的别名(并且只保留一个),但是我不能详细说明适合的过滤器...

有任何线索吗?

更新: 根据我的要求发表评论,我添加了一些示例人员数据:

{ "_id" : "1", "name" : "Alice" },
{ "_id" : "2", "name" : "Bob",   "alias" : "afa776bea788cf4c" },
{ "_id" : "3", "name" : "Bobby", "alias" : "afa776bea788cf4c" },
{ "_id" : "4", "name" : "Zoe",   "alias" : "2211293acc82329a" },

从我正在寻找的查询中,我需要得到:

{ "_id" : "1", "name" : "Alice" },
{ "_id" : "2", "name" : "Bob",   "alias" : "afa776bea788cf4c" },
{ "_id" : "4", "name" : "Zoe",   "alias" : "2211293acc82329a" },

(得到“Bobby”而不是“Bob”也没关系。)

当然这个数据结构不是强制性的,我接受一个改变建议,当然......

2 个答案:

答案 0 :(得分:1)

使用聚合,您可以使用以下$GROUP查询来获取所需的列表:

  

db.collection.aggregate([   {$ group:{&#34; _id&#34;:&#34; $ alias&#34;,&#34; name&#34;:{$ first:&#34; $ name&#34;},&# 34; ID&#34; {$第一:&#34; $ _ ID&#34;}}},   {$项目:{&#34; ID&#34;:1,&#34; _id&#34;:0,&#34;别名&#34;:&#34; $ _ ID&#34;&#34;名称&#34;:1}}   ]);

答案 1 :(得分:0)

尝试Model.distinct操作。

http://mongoosejs.com/docs/api.html#query_Query-distinct

Person.distinct('alias', callback);

这应返回具有别名的不同值的文档列表。