Javascript 不总是提供带参数的查询

Javascript 不总是提供带参数的查询,javascript,mongodb,Javascript,Mongodb,我正在创建一个用户身份验证和注册API,并在register端点中检查是否已经存在具有提供的用户名或电子邮件地址的用户。棘手的是,用户名不是必需的,因此它有时是未定义的。如果有任何现有用户的用户名未定义,并且有人试图注册而不提供用户名(也称为未定义作为用户名),它会找到以前的未定义用户,并且不会让注册继续 如何查询: 查找一个具有电子邮件地址[电子邮件地址]或用户名[用户名]的用户(如果用户名不是未定义的 这是我的路线(使用快车): 如果没有定义用户名,我想我可以进行不同的查询,如下所示: le

我正在创建一个用户身份验证和注册API,并在
register
端点中检查是否已经存在具有提供的用户名或电子邮件地址的用户。棘手的是,用户名不是必需的,因此它有时是未定义的。如果有任何现有用户的用户名
未定义
,并且有人试图注册而不提供用户名(也称为
未定义
作为用户名),它会找到以前的
未定义
用户,并且不会让注册继续

如何查询:

查找一个具有电子邮件地址[电子邮件地址]或用户名[用户名]的用户(如果用户名不是
未定义的

这是我的路线(使用快车):

如果没有定义用户名,我想我可以进行不同的查询,如下所示:

let queryUser;
if (username) {
    queryUser = User.findOne({ $or: [{ email }, { username: { $ne: undefined, username } }] }).exec();
} else {
    queryUser = User.findOne({ email }).exec();
}

但我更希望了解如何使用Mongo处理此类问题。

或者您可以有条件地构建查询:

var query = { $or: [ { email } ] };

if ( req.body.hasOwnProperty('username') ) {
  query.$or.push({ "username": { "$ne": req.body.username.toLowerCase() } }
}

queryUser = User.findOne(query).exec();
这些只是JavaScript对象,可以像其他对象一样进行操作


这就是为什么MongoDB查询语言基于标准数据结构格式的原因

这里有答案。如果发布的答案中有您认为无法解决问题的内容,请对提供的答案进行评论,以便解决您的问题。如果提供的答案确实为所问问题提供了解决方案,那么请不要只留下没有标记答案的问题。我的问题是关于如何在查询本身中做到这一点,而不必修改它。但是,在深入研究Mongo文档之后,当
undefined
作为值传入时,它会匹配所有内容。(这与
collection.find({})
返回所有文档的原因相同。)
var query = { $or: [ { email } ] };

if ( req.body.hasOwnProperty('username') ) {
  query.$or.push({ "username": { "$ne": req.body.username.toLowerCase() } }
}

queryUser = User.findOne(query).exec();