Javascript 如何在Mongoose中仅获取唯一值?

Javascript 如何在Mongoose中仅获取唯一值?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我只需要从集合中获取唯一值。例如: constuserid=`user1`; const users=等待聊天 .find({'$or':[{to:userID},{from:userID}]}) .选择(`-\u id to from`) .lean(); //用户会喜欢: [ {from:`user1`,to:`user2`}, {from:`user1`,to:`user2`}, {from:`user1`,to:`user2`}, {from:`user2`,to:`user1`}, {

我只需要从集合中获取唯一值。例如:

constuserid=`user1`;
const users=等待聊天
.find({'$or':[{to:userID},{from:userID}]})
.选择(`-\u id to from`)
.lean();
//用户会喜欢:
[
{from:`user1`,to:`user2`},
{from:`user1`,to:`user2`},
{from:`user1`,to:`user2`},
{from:`user2`,to:`user1`},
{from:`user3`,to:`user1`},
//…还有10089件物品
];
//我想要这个结果
const result=[`user2`、`user3`];//也排除当前用户

我知道我可以用JS来做这件事。我可以从用户创建一个数组并运行
newset()
,但速度会很慢。Mongoose能代替我做这个吗?

你可以试试聚合查询

  • $match
    您的条件
  • $group
    按null设置,并构造从用户到用户的唯一数组
  • $setUnion
    数组获取唯一的
    用户
  • $filter
    迭代上述联合数组的循环并删除当前用户

我觉得很奇怪。它不起作用了。结果是一个空数组(console.log(users))。我已经从聚合管道数组中删除了第二个和第三个元素,结果也是一个空数组。我不确定,能否尝试在函数后添加.exec(),就像我更新了答案一样。我添加了
const users=wait Chat.aggregate([{$match:{$or:[{{to:userID},{from:userID}]},]]).exec();console.log(用户)。您的代码和它只返回[]数据库集合中
from
to
字段中的实际内容?Types.ObjectId
const schema=new schema({date:{type:date,required:true},read:{type:Boolean,default:false},content:{type:String,required:true},to:{type:Types.ObjectId,ref:
User
,required:true},from:{type:Types.ObjectId,ref:
User
,required:true},});
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);