首页 > 解决方案 > 如何在 MongoDB 中通过 ._id 过滤掉用户帐户?

问题描述

我正在创建一个火种克隆,当用户返回使用该应用程序时,我想过滤掉其他喜欢或不喜欢的用户帐户。

过滤器函数将 currentUser 和用户帐户作为参数,这些参数已由 GET 请求返回的结果传入。

如果当前用户在之前的会话中喜欢或不喜欢任何其他用户帐户,我希望过滤掉这些帐户,以便当前用户无法再次看到它们。

我已经在这工作了 3 周,尝试了多种不同的方式来循环遍历所有内容并比较结果,但我仍然无法让它正常工作。我现在所拥有的有点工作。但是,当您创建一个新帐户时,它会立即被过滤掉,而没有机会被喜欢或不喜欢。当一些用户被喜欢或不喜欢时也会发生同样的情况,但如果页面被留下但随后重新调整给任何未被喜欢或不喜欢的用户,也会被删除。如何修复此功能以正常工作?或者有没有更好的方法来通过 ._id 过滤其他帐户?

获取请求

router.get( "/user/match/:id", authenticateUser, asyncHandler(async (req, res, error) => {

    const currentUser = await User.findOne({ _id: req.params.id });

    if (currentUser.gender === "Male" && currentUser.sexualPreference === "Straight") {

      const users = await User.find({ gender: "Female", sexualPreference: "Straight"});

      filter(currentUser, users, req, res, error);

    };
  })
);

过滤功能

const filter = async (currentUser, users, req, res, error) => {

    try {

      if (currentUser.likes.length > 0) {
        for (const user of users) {
          for (const like of currentUser.likes) {
            if (user._id.equals(like)) {
              const index = users.indexOf(user);
              users.splice(index, 1);
              console.log(users)
            }
          }
        }
      }

    else  if (currentUser.dislikes.length > 0)  {
        console.log("dislikes")
        for (const user of users) {
          for (const like of currentUser.dislikes) {
            if (user._id.equals(like)) {
              const index = users.indexOf(user);
              users.splice(index, 1);
              console.log(users)
            }
          }
        }
      } else {
        return res.json({ users });
      }

 
      

    } catch (error) {
      console.log(error, "error");
    }
  };

当前用户

{
  matches: [],
  likes: [
    '615080280d6b7c913824bf5d',
    '61507fec0d6b7c913824bf5c',
    '61508c3d1fb5b195c62a424b',
    '6150906c0709f697acb19ae3'
  ],
  dislikes: [
    '61509280068887983227015f',
  ],
  _id: 615080750d6b7c913824bf5f,
  firstName: 'Daenerys',
  lastName: 'Targeryen',
  emailAddress: 'Daenerys@gmail.com',
  password: '$2a$10$BHZpaTKvmXp5xxDx.z1vReZ9ae922YUgn2ZDha0ou9yxe1jlXAZ6q',
  gender: 'Female',
  sexualPreference: 'Straight',
  age: 26,
  description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
  path: 'uploads/1632665717723.jpg',
  __v: 0
}

用户

[
  {
    matches: [],
    likes: [],
    dislikes: [],
    _id: 61507fec0d6b7c913824bf5c,
    firstName: 'Jon',
    lastName: 'Snow',
    emailAddress: 'JonSnow@gmail.com',
    password: '$2a$10$IrnMgY6dlzftULIYNy/SWOAGalXZ30/bO78BPnaSmIT65bniQ.9pO',
    gender: 'Male',
    sexualPreference: 'Straight',
    age: 26,
    description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
    path: 'uploads/1632665580169.jpg',
    __v: 0
  },
  {
    matches: [],
    likes: [],
    dislikes: [],
    _id: 615080280d6b7c913824bf5d,
    firstName: 'Robb',
    lastName: 'Stark',
    emailAddress: 'RobbStark@gmail.com',
    password: '$2a$10$FrBMQFj4DDbx4j9qk7iK9e.YRwSC6wd2t7QczrPEteOEniPNMqzi2',
    gender: 'Male',
    sexualPreference: 'Straight',
    age: 26,
    description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
    path: 'uploads/1632665640435.jpg',
    __v: 0
  },
  {
    matches: [],
    likes: [],
    dislikes: [],
    _id: 61508c3d1fb5b195c62a424b,
    firstName: 'Stannis',
    lastName: 'Baratheon',
    emailAddress: 'Stannis@gmail.com',
    password: '$2a$10$8poGckIRWmuM20a97FS4HuugGwz9eocL5YfLZL46V4qi5Bk/czyQe',
    gender: 'Male',
    sexualPreference: 'Straight',
    age: 40,
    description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
    path: 'uploads/1632668733813.jpg',
    __v: 0
  },

]


标签: javascriptnode.jsmongodbexpress

解决方案


您正在使用Users.findfrom mongodb 列出用户,但该函数实际上返回一个游标而不是文档数组。

const users = await User.find({ gender: "Female", sexualPreference: "Straight"});

可以成为。

const users = await User.find({ gender: "Female", sexualPreference: "Straight"}).toArray();

但是,我建议查看驱动程序文档以查找文档。出于性能原因,可能有更好的方法来布局代码。 MongoDB 查找多个文档


推荐阅读