我有一个像这样的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”也没关系。)
当然这个数据结构不是强制性的,我接受一个改变建议,当然......
答案 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);
这应返回具有别名的不同值的文档列表。