【问题标题】:MongoDB only return document where user from other document does not match fieldMongoDB 仅返回来自其他文档的用户与字段不匹配的文档
【发布时间】:2019-09-18 20:02:31
【问题描述】:

JavaScript:

exports.userWithoutProject = async (req, res, next) => {
  try {
    let benchUser = [];
    const project = await Project.find({})
    const users = await User.find({}, {
      email: 1,
      _id: 0
    })

    for (let i = 0; i < users.length; i++) {
      for (let j = 0; j < project.length; j++) {
        for (let k = 0; k < project[j].seats.length; k++) {
          if (users[i].email !== project[j].seats[k].employee && project[j].seats[k].employee === undefined) {
            benchUser.push(users[i].email)
          }
        }
      }
    }

    const uniq = [...new Set(benchUser)];

    return res.json({
      users: uniq
    })
  } catch (error) {
    next(error)
  }
}

用户:

[{ 
   email: 'user1@email.com',
 }, { 
   email: 'user2@email.com',
 }, {
   email: 'user3@email.com' 
 }]

项目(对象数组):

{ _id: 5cc2dd2eb3eea7004c9a7240,
  name: 'Project One',
  description:
   'Lorem Ipsum',
  start: '2018-06-01T09:45:00.000Z',
  end: '2019-12-31T09:45:00.000Z',
  seats:
   [ 
     { 
       skills: [Array],
       _id: 5cc2e3cab3eea7004c9a724a,
       start: '2018-06-01T09:45:00.000Z',
       end: '2019-12-31T09:45:00.000Z',
       potentialExtension: '2020-06-31T09:45:00.000Z',
       role: 'Dev',
       approved: true,
       workload: 10,
       employee: 'user1@email.com' 
     },
     { 
       skills: [Array],
       _id: 5cc2e3cab3eea7004c9a7241,
       start: '2018-06-01T09:45:00.000Z',
       end: '2019-12-31T09:45:00.000Z',
       potentialExtension: '2020-06-31T09:45:00.000Z',
       role: 'PM',
       approved: true,
       workload: 20,
       employee: 'user3@email.com' 
     }
   ]
}

我的目标:

我想让所有没有项目席位的用户返回。

我有多个项目,每个项目都有一个seat,其中用户的电子邮件写在employee 字段中。所以我必须遍历所有项目并循环遍历每个项目席位以检查我的用户是否匹配。

我从上面的方法返回 user2@email.com 这是正确的,但也返回 user1@email.com 这是不正确的。

【问题讨论】:

    标签: javascript arrays mongodb object mongoose


    【解决方案1】:

    您可以使用:Array.prototype.filterArray.prototype.includes 来实现您的要求

    let users = [{ 
    	email: 'user1@email.com',
    }, { 
    	email: 'user2@email.com',
    }, {
    	email: 'user3@email.com' 
    }];
    
    let projects = [{ _id: '5cc2dd2eb3eea7004c9a7240',
      name: 'Project One',
      description:
       'Lorem Ipsum',
      start: '2018-06-01T09:45:00.000Z',
      end: '2019-12-31T09:45:00.000Z',
      seats:
       [ 
         { 
           skills: [Array],
           _id: '5cc2e3cab3eea7004c9a724a',
           start: '2018-06-01T09:45:00.000Z',
           end: '2019-12-31T09:45:00.000Z',
           potentialExtension: '2020-06-31T09:45:00.000Z',
           role: 'Dev',
           approved: true,
           workload: 10,
           employee: 'user1@email.com' 
         },
         { 
           skills: [Array],
           _id: '5cc2e3cab3eea7004c9a7241',
           start: '2018-06-01T09:45:00.000Z',
           end: '2019-12-31T09:45:00.000Z',
           potentialExtension: '2020-06-31T09:45:00.000Z',
           role: 'PM',
           approved: true,
           workload: 20,
           employee: 'user3@email.com' 
         }
       ]
    }];
    
    let projectUsers = new Set();
    projects.forEach(({seats}) => {
    	seats.forEach(({employee}) => projectUsers.add(employee));
    });
    
    let out = users.filter(({email}) => !Array.from(projectUsers).includes(email));
    console.log(out)

    【讨论】:

      猜你喜欢
      • 2015-10-31
      • 2021-01-28
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 2015-06-09
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多