简体   繁体   中英

mongodb having multiple conditions for $nin and data coming from the client

I'm trying to do a query based on some data but apparently, $nin is not reading the returned values from the function.

My goal is to not show all the users I've followed on the recommended section where there is a get request to receive all the users registered on the db. I do have the following users on the function, however when I try to do the query, its not working and I've tried for hours fixing that problem.

At username: { $nin: [allFollowers.forEach((following) => following.username)] => Doing this, doesnt work, however when I put strings from the list of following users such as 'user1', 'user2', it works. My api updates on the client and I dont see those two users I follow on the recommended section.

I'd appreciate if you could help me.

   exports.recommendedUsers = async function (req, res) {
    // all following users in an array
    const { followingUsers } = req.body;
    /* console.log(followingUsers) =>
    [
  {
    username: 'user1',
    avatar: '//www.gravatar.com/avatar/c76fa83b3saddasdas2c04a59d6e063918badbf53?s=200&r=pg&d=mm'
  },
  {
    username: 'user2',
    avatar: '//www.gravatar.com/avatar/3758e369b058b393541asdasda4d0e8a1d57402?s=200&r=pg&d=mm'
  },
  {
    username: 'uiser3',
    avatar: 'https://static-cdn.jtvnw.net/jtv_user_pictures/bobross-profile_image-0b9dd16cascad7a9bb16b5-70x70.jpeg'
  },
  {
    username: 'user4',
    avatar: 'https://static-cdn.jtvnw.net/jtv_user_pictures/82b63a01-628f-4c81-9b05-dd3a501asdasd1fdda-profile_image-70x70.png'
  },
  {
    username: 'user5',
    avatar: '//www.gravatar.com/avatar/93cd495a412a1b2asdadabe9b9c72bc246e271?s=200&r=pg&d=mm'
  }
] */

    let allFollowers = [];
    let following = req.body.followingUsers.forEach((follow) =>
        allFollowers.push(JSON.stringify(follow.username))
    );
    console.log(`this is all followers: ${allFollowers}`);

    try {
        const user = User.find(
            {
                _id: { $ne: req.user.id },

                username: {
                    $nin: [allFollowers.forEach((following) => following.username)], // not working
                },
            },
            function (err, users) {
                let userMap = {};
                users.forEach(function (user) {
                    userMap[user._id] = user;
                });

                const arrayData = Object.values(userMap);

                return res.json(arrayData);
            }
        ).select('-password');
    } catch (e) {
        console.log(e.message);
    }
};

You are using foreach function, that is wrong:

username: {
            $nin: [allFollowers.forEach((following) => following.username)],
}

The return value of foreach is undefined , use map function.

username: {
                $nin: [allFollowers.map((following) => following.username)],
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM