作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只需要从集合中获取唯一值。例如:
const userID = `user1`;
const users = await Chat
.find({'$or': [{to: userID}, {from: userID}]})
.select(`-_id to from`)
.lean();
// users will be like:
[
{from: `user1`, to: `user2`},
{from: `user1`, to: `user2`},
{from: `user1`, to: `user2`},
{from: `user2`, to: `user1`},
{from: `user3`, to: `user1`},
// ... 10089 more items
];
// and I want this in result
const result = [`user2`, `user3`]; // exclude current user too
我知道我可以使用 JS 做到这一点。我可以从用户创建一个数组并运行
new Set()
,但它会很慢。 Mongoose 可以代替我这样做吗?
最佳答案
您可以尝试聚合查询,
$match
您的情况$group
通过 null 并构造 from
的唯一数组用户和 to
用户 $setUnion
获得独一无二的users
来自 from
和 to
数组 $filter
迭代上述联合数组的循环并删除当前用户const userID = mongoose.Types.ObjectId(`user1`);
const users = await Chat.aggregate([
{ $match: { $or: [{ to: userID }, { from: userID }] } },
{
$group: {
_id: null,
from: { $addToSet: "$from" },
to: { $addToSet: "$to" }
}
},
{
$project: {
_id: 0,
users: {
$filter: {
input: { $setUnion: ["$from", "$to"] },
cond: { $ne: ["$$this", userID] }
}
}
}
}
]).exec();
console.log(users[0].users);
Playground
关于javascript - 如何在 Mongoose 中只获得唯一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67449196/
我是一名优秀的程序员,十分优秀!