gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:06:21 26 4
gpt4 key购买 nike

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

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

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

由于我从不同的来源获取人员,因此某些文档可以引用同一个人:在本例中,我希望将两个人都保留在数据库中,并为他们分配一个(唯一的)别名。

目前,当我需要进行查询以明确列出人员时,我会检索所有人员,然后过滤掉别名,只保留其中一个(我不在乎是哪一个),用javascript(当然我需要也保留没有别名的人)。像这样的事情:

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”也可以)。

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

最佳答案

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

db.collection.aggregate([ {$group:{"_id":"$alias", "name":{$first:"$name"}, "id":{$first:"$_id"}}}, {$project:{"id":1,"_id":0,"alias":"$_id","name":1}} ]);

关于javascript - mongodb:如何为具有相同属性值的每一组过滤一个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com