【问题标题】:How can I filter out user accounts by ._id in MongoDB?如何在 MongoDB 中通过 ._id 过滤掉用户帐户?
【发布时间】:2021-11-19 00:37:16
【问题描述】:

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

filter函数将currentUser和user account作为参数传入,由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
  },

]


【问题讨论】:

    标签: javascript node.js mongodb express


    【解决方案1】:

    您正在使用 mongodb 中的 Users.find 列出用户,但该函数实际上返回 cursor 而不是文档数组。

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

    可以变成。

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

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

    【讨论】:

    • 干杯特雷弗,不幸的是这并没有改变任何东西。我只是收到一条错误消息TypeError: User.find(...).toArray is not a function。不过很感激!
    • @RandyBeans 如果你console.log(User.find({ gender: "Female"})),输出是什么?用户变量是集合变量吗?
    • 你好 Trevor,我已经按照你的建议重构了我的代码,我知道问题已经解决。我认为过滤器函数中的代码真的很臃肿。干杯!
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多